sql >> Databáze >  >> RDS >> Mysql

MySQL:Mohu provést levé spojení a vytáhnout pouze jeden řádek z tabulky spojení?

Dovolte mi shrnout, co jsem pochopil:chtěli byste vybrat každý tiket a jeho poslední řešení.

Rád používám pro tento druh otázky následující vzor, ​​protože se vyhýbá vzoru poddotazu, a je tedy spíše dobrý tam, kde je potřeba výkon. Nevýhodou je, že je to trochu složitější na pochopení:

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;

Pro lepší pochopení jsem napsal pouze jádro vzoru.

Klíče jsou:

  • LEVÝ SPOJ solutions tabulka sama se sebou s s1.ticket_id = s2.ticket_id podmínka:emuluje GROUP BY ticket_id .

  • podmínku s2.id > s1.id :je to SQL pro "chci jen poslední řešení", emuluje MAX() . Předpokládal jsem, že ve vašem modelu je to the last znamená with the greatest id ale můžete zde použít podmínku data. Všimněte si, že s2.id < s1.id by vám poskytlo první řešení.

  • klauzule WHERE s2.id IS NULL :ten nejpodivnější, ale naprosto nezbytný... uchovává pouze záznamy, které chcete.

Zkuste to a dejte mi vědět :)

Úprava 1: Právě jsem si uvědomil, že druhý bodový předpoklad problém příliš zjednodušuje. Díky tomu je to ještě zajímavější :p Snažím se zjistit, jak tento vzor může fungovat s vaším date, id objednávání.

Úprava 2: Dobře, funguje to skvěle s malým otočením. Podmínka na LEFT JOIN se stane:

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. Jak provést uloženou proceduru Oracle prostřednictvím odkazu na databázi

  2. MySQL-db lib pro Python 3.x?

  3. percentil podle COUNT(DISTINCT) s korelací WHERE funguje pouze s pohledem (nebo bez DISTINCT)

  4. Jak ukládat pole v MySQL?