Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> LEFT JOIN, nieprawidłowe wyniki, ...
ennics
post
Post #1





Grupa: Zarejestrowani
Postów: 312
Pomógł: 0
Dołączył: 29.12.2004

Ostrzeżenie: (0%)
-----


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ć.

Ten post edytował ennics 19.10.2005, 13:37:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
hesus
post
Post #2





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 24.03.2005

Ostrzeżenie: (0%)
-----


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


Ten post edytował hesus 19.10.2005, 14:59:26
Go to the top of the page
+Quote Post
ennics
post
Post #3





Grupa: Zarejestrowani
Postów: 312
Pomógł: 0
Dołączył: 29.12.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 12:50