Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:posso eseguire un join sinistro ed estrarre solo una riga dalla tabella di join?

Riassumo quello che ho capito:vorresti selezionare ogni biglietto e la sua ultima soluzione.

Mi piace usare il seguente modello per questo tipo di domande in quanto evita il modello di sottoquery ed è quindi piuttosto buono dove sono necessarie prestazioni. Lo svantaggio è che è un po' complicato da capire:

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;

Ho scritto solo il cuore del modello per una migliore comprensione.

Le chiavi sono:

  • il LEFT JOIN delle solutions tabella con se stesso con s1.ticket_id = s2.ticket_id condizione:emula il GROUP BY ticket_id .

  • la condizione s2.id > s1.id :è l'SQL per "Voglio solo l'ultima soluzione", emula il MAX() . Ho pensato che nel tuo modello, the last significa with the greatest id ma potresti usare qui una condizione sulla data. Tieni presente che s2.id < s1.id ti darebbe la prima soluzione.

  • la clausola WHERE s2.id IS NULL :il più strano ma assolutamente necessario... conserva solo i record che vuoi.

Fai una prova e fammi sapere :)

Modifica 1: Mi sono appena reso conto che l'ipotesi del secondo punto stava semplificando eccessivamente il problema. Questo lo rende ancora più interessante :p Sto cercando di vedere come questo modello potrebbe funzionare con il tuo date, id ordinazione.

Modifica 2: Ok, funziona benissimo con una piccola svolta. La condizione sul LEFT JOIN diventa:

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))