Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:Czy mogę wykonać lewe złączenie i wyciągnąć tylko jeden wiersz z tabeli złączeń?

Pozwól, że podsumuję to, co zrozumiałem:chciałbyś wybrać każdy bilet i jego ostatnie rozwiązanie.

Lubię używać następującego wzorca do tego rodzaju pytań, ponieważ unika on wzorca podzapytania i dlatego jest raczej dobry tam, gdzie potrzebna jest wydajność. Wadą jest to, że jest to trochę trudne do zrozumienia:

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;

Napisałem tylko sedno wzoru dla lepszego zrozumienia.

Klucze to:

  • LEWE ZŁĄCZENIE solutions tabela ze sobą z s1.ticket_id = s2.ticket_id warunek:emuluje GROUP BY ticket_id .

  • warunek s2.id > s1.id :jest to SQL dla "Chcę tylko ostatniego rozwiązania", emuluje MAX() . Założyłem, że w twoim modelu the last oznacza with the greatest id ale możesz użyć tutaj warunku na dacie. Zauważ, że s2.id < s1.id da ci pierwsze rozwiązanie.

  • klauzula WHERE s2.id IS NULL :najdziwniejszy, ale absolutnie niezbędny... przechowuje tylko te rekordy, które chcesz.

Spróbuj i daj mi znać :)

Edytuj 1: Właśnie zdałem sobie sprawę, że drugie założenie było zbytnim uproszczeniem problemu. To sprawia, że ​​jest jeszcze ciekawiej :p Próbuję zobaczyć, jak ten wzorzec może działać z Twoją date, id zamawianie.

Edytuj 2: Ok, działa świetnie z niewielkim skrętem. Warunek LEFT JOIN staje się:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Projekt bazy danych zarządzania zapasami

  2. Zduplikowany wpis dla klucza „PRIMARY”. Ignorowanie spacji dla ciągów

  3. W MySQL:Jak przekazać nazwę tabeli jako procedurę składowaną i/lub argument funkcji?

  4. Jak mogę zakończyć wywołanie asynchroniczne, aby zachowywało się synchronicznie?

  5. Czy MySQL Regexp obsługuje dopasowanie Unicode?