sql >> Database >  >> RDS >> Mysql

MySQL:kan ik een left join doen en slechts één rij uit de join-tabel halen?

Laat me samenvatten wat ik heb begrepen:je wilt elk ticket en de laatste oplossing selecteren.

Ik gebruik graag het volgende patroon voor dit soort vragen omdat het het subquerypatroon vermijdt en daarom redelijk goed is waar prestaties nodig zijn. Het nadeel is dat het een beetje lastig te begrijpen is:

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;

Ik heb alleen het hart van het patroon geschreven voor een beter begrip.

De sleutels zijn:

  • de LEFT JOIN van de solutions tabel met zichzelf met de s1.ticket_id = s2.ticket_id voorwaarde:het emuleert de GROUP BY ticket_id .

  • de voorwaarde s2.id > s1.id :het is de SQL voor "Ik wil alleen de laatste oplossing", het emuleert de MAX() . Ik nam aan dat in uw model, the last betekent with the greatest id maar je zou hier een voorwaarde voor de datum kunnen gebruiken. Merk op dat s2.id < s1.id zou je de eerste oplossing geven.

  • de WHERE-clausule s2.id IS NULL :de raarste maar absoluut noodzakelijk... bewaart alleen de records die u wilt.

Probeer het en laat het me weten :)

Bewerken 1: Ik realiseerde me net dat de veronderstelling van het tweede punt het probleem te eenvoudig maakte. Dat maakt het nog interessanter :p Ik probeer te zien hoe dit patroon kan werken met je date, id bestellen.

Bewerken 2: Ok, het werkt geweldig met een kleine twist. De voorwaarde op de LEFT JOIN wordt:

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


  1. SQLite IN

  2. MySQL converteert datumreeks naar Unix-tijdstempel

  3. Mysql-dumps en -importen versnellen

  4. SQL Server 2016:een database maken