Deixe-me resumir o que entendi:você gostaria de selecionar cada ticket e sua última solução.
Eu gosto de usar o padrão a seguir para esse tipo de pergunta, pois evita o padrão de subconsulta e, portanto, é bastante bom onde o desempenho é necessário. A desvantagem é que é um pouco complicado de entender:
SELECT
t.*,
s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;
Eu escrevi apenas o coração do padrão para uma melhor compreensão.
As chaves são:
-
o LEFT JOIN dassolutions
tabela consigo mesma com os1.ticket_id = s2.ticket_id
condição:emula oGROUP BY ticket_id
.
-
a condiçãos2.id > s1.id
:é o SQL para "Só quero a última solução", ele emula oMAX()
. Presumi que em seu modelo,the last
significawith the greatest id
mas você pode usar aqui uma condição na data. Observe ques2.id < s1.id
lhe daria a primeira solução.
-
a cláusula WHEREs2.id IS NULL
:o mais estranho, mas absolutamente necessário... mantém apenas os registros que você deseja.
Experimente e me conte :)
Editar 1: Acabei de perceber que a suposição do segundo ponto estava simplificando demais o problema. Isso torna ainda mais interessante :p Estou tentando ver como esse padrão pode funcionar com seu
date, id
encomenda. Editar 2: Ok, funciona muito bem com um pequeno toque. A condição no LEFT JOIN torna-se:
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))