sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Kan jag göra en vänster-join och dra bara en rad från join-tabellen?

Låt mig sammanfatta vad jag förstod:du vill välja varje biljett och dess sista lösning.

Jag gillar att använda följande mönster för den här typen av frågor eftersom det undviker subquery-mönstret och är därför ganska bra där prestanda behövs. Nackdelen är att det är lite knepigt att förstå:

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;

Jag skrev bara hjärtat av mönstret för en bättre förståelse.

Nycklarna är:

  • VÄNSTER JOIN för solutions tabell med sig själv med s1.ticket_id = s2.ticket_id villkor:den emulerar GROUP BY ticket_id .

  • villkoret s2.id > s1.id :det är SQL för "Jag vill bara ha den sista lösningen", den emulerar MAX() . Jag antog att i din modell, the last betyder with the greatest id men du kan här använda ett villkor om datumet. Observera att s2.id < s1.id skulle ge dig den första lösningen.

  • WHERE-satsen s2.id IS NULL :den konstigaste men absolut nödvändig... håller bara de register du vill ha.

Testa och låt mig veta :)

Redigera 1: Jag insåg precis att det andra antagandet var att förenkla problemet. Det gör det ännu mer intressant :p Jag försöker se hur det här mönstret kan fungera med ditt date, id beställning.

Redigera 2: Ok, det fungerar utmärkt med en liten twist. Villkoret på LEFT JOIN blir:

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. PHP &mySQL:Enkel kod för att implementera Transaktion - Commit &Rollback

  2. Hur man ställer in en anslutningstimeout beroende på användarinloggning i MySQL

  3. Fel syntax nära ')' anropar lagrad procedur med GETDATE

  4. MySQL:finns inte i GROUP BY