Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie po wartościach z innej tabeli
TomASS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Witam,

Mam dwie tabele:

1. transporty [ID, Numer, NumerFaktury, Waluta, Masa, Odleglosc]
2. miejsca [ID, Rodzaj(zaladunek/rozladunek), ID_transport, Miejscowosc, Kod, Ulica]

Dzięki takiemu czemuś jeden transport może posiadać kilka miejsc załadunku oraz kilka miejsc rozładunku, dodawanie miejsc jest dziecinnie proste - wystarczy dodać do tabeli miejsca odpowiedni rekord.
Transporty wyświetlam oczywiście:
  1. SELECT * FROM transporty

Trasę pobieram już wewnątrz pętli:
  1. SELECT * FROM miejsca WHERE ID_transport=$id_transp AND Rodzaj='zaladunek';



Sprawa komplikuje się, gdy chcę utworzyć filtr:
  1. SELECT * FROM transporty WHERE $filtr;

który zwróci mi wszystkie transporty które pojechały np. do Bytomia. Co powinienem wstawić w $filtr?

Dziękuję za pomoc.

Ten post edytował TomASS 26.04.2010, 09:13:54
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Musisz:
1. Dołączyć tabelę miejsca łącząc ją po odpowiedniej kolumnie (zapewne miejsca.id_transport = transporty.id) - JOIN.
2. Podać warunek dla kolumny miejscowosc - np. miejsca.miejscowosc = 'Bytom'
Go to the top of the page
+Quote Post
TomASS
post
Post #3





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Zauważ, że jest tutaj realacja jeden do wielu, tzn. jeden transport zawiera więcej niż jeden wpis w tabeli miejsca. Czy da się to zrobić tak aby tylko zmodyfikować odpowiednio klauzulę WHERE?
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Zauważyłem, ale co to zmienia? Jeśli chcesz wyświetlić listę transportów bez powtórzeń to użyj DISTINCT.
Go to the top of the page
+Quote Post
TomASS
post
Post #5





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Mówisz aby zrobić:
  1. SELECT DISTINCT Nr FROM miejsca AS M LEFT JOIN transporty AS T ON (T.ID=M.ID_transport) WHERE $filtr;

?
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Powinno śmigać:
  1. SELECT DISTINCT transporty.* FROM transporty JOIN miejsca ON (miejsca.ID_transport = transporty.ID) WHERE miejsca.Miejscowosc = 'Bytom';

Twoje idzie w tym samym kierunku, ale odwrotnie łączysz tabele. Nie wiem czy ma to jakieś znaczenie np. pod kątem optymalizacji - dobrze by było gdybyś ktoś się na ten temat wypowiedział.

//Edit:
Chyba jednak lepiej zacząć od tabeli miejsca. Z tego co pamiętam to powinno się zaczynać od tej tabeli, która na wstępie odrzuci najwięcej niepasujących rekordów.

Ten post edytował phpion 26.04.2010, 10:48:46
Go to the top of the page
+Quote Post
TomASS
post
Post #7





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

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


Dokładnie zacząłem od tabeli miejsc. Zwiększyło to wykonywanie zapytania o 40% a dodatkowo zaczęło używać indeksów. Dzięki za pomoc (jakoś wpadłem na łączenie tabel, ale użycie DISTNICT jakoś mi optymalizacyjne mało pasuje :/ ). Niemniej działa i działa dosyć szybko.
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: 23.08.2025 - 22:14