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

MySQL:Kan jeg lave en venstre join og kun trække én række fra jointabellen?

Lad mig opsummere, hvad jeg forstod:Du vil gerne vælge hver billet og dens sidste løsning.

Jeg kan godt lide at bruge følgende mønster til denne slags spørgsmål, da det undgår underforespørgselsmønsteret og derfor er ret godt, hvor der er behov for ydeevne. Ulempen er, at det er lidt svært at forstå:

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;

Jeg skrev kun hjertet af mønsteret for en bedre forståelse.

Nøglerne er:

  • VENSTRE JOIN af solutions tabel med sig selv med s1.ticket_id = s2.ticket_id betingelse:den emulerer GROUP BY ticket_id .

  • betingelsen s2.id > s1.id :det er SQL'en for "Jeg vil kun have den sidste løsning", den emulerer MAX() . Jeg antog, at i din model, the last betyder with the greatest id men du kan her bruge en betingelse om datoen. Bemærk, at s2.id < s1.id ville give dig den første løsning.

  • WHERE-sætningen s2.id IS NULL :den mærkeligste, men absolut nødvendig... holder kun de optegnelser, du ønsker.

Prøv og fortæl mig :)

Rediger 1: Jeg indså lige, at det andet punkt antagelse oversimplificerede problemet. Det gør det endnu mere interessant :p Jeg prøver at se, hvordan dette mønster kan fungere med din date, id bestilling.

Rediger 2: Ok, det fungerer godt med et lille twist. Betingelsen på LEFT JOIN bliver:

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. SQL flertal/ental søgninger

  2. SÆT SQLBLANKLINES:Sådan tillades tomme linjer i SQLcl &SQL*Plus

  3. Databaseautomatisering bag Sveriges nye elektroniske identitet Freja eID

  4. bruge If else-betingelsen til at vælge kolonnen i mysql?