Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: LEFT JOIN, nieprawidłowe wyniki
Forum PHP.pl > Forum > Bazy danych > MySQL
ennics
cześć, mam problem z pobieraniem wyników z dwóch
tabel. Pierwsza tabela LEASE_LINES zawiera zbiór rekordów
które chcę wyświetlić na stronie. Drug tabela CLT_Log zawiera dane na temat tych rekordów, przy czym ich występowanie w tabeli CLT_Log jest opcjonalne, tzn. jeśli np. rekord z tabeli LEASE_LINES był wyświetlany przez użytkownika, do CLT_Log
została zapisana ta interakcja. Problem w tym że kwerenda zwraca wyniki dosyć chaotycznie. Docelowo chciałem aby wszytskie wyniki z tabeli LEASE_LINES były wyświetlane a dodatkowo jeśli są w tabeli CLT_Log (identyfikowane po id_rec) żeby były posiłkowane danymi z tej tabeli. Kwerenda wygląda tak:

  1. SELECT *
  2. FROM LEASE_LINES LL
  3. LEFT JOIN CLT_Log LG ON LL.id_rec = LG.id_rec
  4. WHERE LG.id_pack = '5' AND LG.STATUS <> 'INTER' AND (
  5. LG.id_log = (
  6. SELECT max(G2.id_log)
  7.  
  8. FROM LEASE_LINES L2
  9. LEFT JOIN CLT_Log G2 USING(id_rec)
  10. WHERE G2.id_rec = LL.id_rec
  11. )
  12. ) OR LG.id_rec IS NULL
  13. ORDER BY LL.id_rec ASC LIMIT 0, 30

dalczego select max - w tablei CLT_Log rekordy mogą być zdublowane, tzn jeden rekord z LEASE_LINES mógł mieć kilka interakcji, wybieram ostatnią.
i wyświetla wyniki które są w obu tabelach a czasami pojedyncze sztuki których nie ma w CLT_Log
struktury tabel:

  1. mysql> SHOW FIELDS
  2. FROM `CLT_Log`; +----------+------------------+------+-----+---------+----------------+
  3. | FIELD | Type | NULL | KEY | DEFAULT | Extra |
  4. +----------+------------------+------+-----+---------+----------------+
  5. | id_log | int(11) UNSIGNED | | PRI | NULL | AUTO_INCREMENT |
  6. | id_pack | int(11) | | | 0 | |
  7. | id_user | int(11) | | MUL | 0 | |
  8. | id_table | int(11) | | MUL | 0 | |
  9. | id_rec | int(11) | | MUL | 0 | |
  10. | date_in | datetime | YES | | NULL | |
  11. | date_out | datetime | YES | | NULL | |
  12. | STATUS | varchar(255) | | | | |
  13. | substat | varchar(50) | | | | |
  14. | userinfo | text | | | | |
  15. +----------+------------------+------+-----+---------+----------------+
  16. 10 rows IN SET (0.00 sec)
  17.  
  18. [SQL]mysql> SHOW FIELDS
  19. FROM LEASE_LINES +----------------------+------------------+------+-----+---------+----------------+
  20. | FIELD | Type | NULL | KEY | DEFAULT | Extra |
  21. +----------------------+------------------+------+-----+---------+----------------+
  22. | id_rec | int(11) UNSIGNED | | PRI | NULL | AUTO_INCREMENT |
  23. | Nazwa_klienta | varchar(255) | | | | |
  24. | Adres_klienta | varchar(255) | | | | |
  25. | Oznaczenie_teczki | varchar(50) | | | | |
  26. | Edycja2 | varchar(50) | | | | |
  27. +----------------------+------------------+------+-----+---------+----------------+
  28. 5 rows IN SET (0.00 sec)


proszę o pomoc, zaczynam wysiadać.
hesus
Nie w tym miejscu nawias i raczej niepotrzebnie stosujesz złączenie tabel w podzapytaniu. Pisane w trybie fast więc mogą być błędy.

  1. SELECT *
  2. FROM LEASE_LINES LL LEFT JOIN CLT_Log LG ON LL.id_rec = LG.id_rec
  3. WHERE LG.id_pack = '5' AND LG.STATUS <> 'INTER' AND (LG.id_log = (
  4. SELECT max(G2.id_log)
  5. FROM CLT_Log G2
  6. WHERE G2.id_rec = LL.id_rec) OR LG.id_rec IS NULL)
  7. ORDER BY LL.id_rec ASC LIMIT 0, 30
ennics
dzięki za cenną radę. Ostatecznie działa w postaci
  1. SELECT *
  2. FROM LEASE_LINES S2
  3. LEFT JOIN CLT_Log L ON S2.id_rec = L.id_rec AND L.id_pack = '5'
  4. WHERE (
  5. L.id_log = (
  6. SELECT max( G2.id_log )
  7.  
  8. FROM CLT_Log G2
  9. WHERE G2.id_rec = S2.id_rec
  10. ) AND L.STATUS <> 'CLOSED'
  11. ) OR L.id_rec IS NULL
  12. ORDER BY S2.id_rec ASC LIMIT 0, 220

przeczytałem w manualu że warunki dla JOINów powinno się podawać po
klauzuli JOIN a nie po WHERE.
SongoQ
Cytat
przeczytałem w manualu że warunki dla JOINów powinno się podawać po
klauzuli JOIN a nie po WHERE

To zalezy od specyfiki bazy danych.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.