Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:Posso fazer uma junção à esquerda e puxar apenas uma linha da tabela de junção?


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 das solutions tabela consigo mesma com o s1.ticket_id = s2.ticket_id condição:emula o GROUP BY ticket_id .

  • a condição s2.id > s1.id :é o SQL para "Só quero a última solução", ele emula o MAX() . Presumi que em seu modelo, the last significa with the greatest id mas você pode usar aqui uma condição na data. Observe que s2.id < s1.id lhe daria a primeira solução.

  • a cláusula WHERE s2.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))