Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie po wartościach z innej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
TomASS
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.
phpion
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'
TomASS
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?
phpion
Zauważyłem, ale co to zmienia? Jeśli chcesz wyświetlić listę transportów bez powtórzeń to użyj DISTINCT.
TomASS
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;

?
phpion
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.
TomASS
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.
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.