Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie do sprawdzenia
Forum PHP.pl > Forum > Bazy danych > MySQL
mysz0n
mam takie zapytanie
  1. SELECT id_zamowienia, z.numer_zgloszenia, z.data_zgloszenia, z.imie_nazwisko, z.dowod, z.pakiet, z.priorytet, z.skad, p.id_pakietu, p.nazwa_pakietu, r.id_priorytetu, r.nazwa_priorytetu
  2. FROM zamowienia z, pakiety p, priorytety r
  3. WHERE LOWER(z.imie_nazwisko) LIKE '%koł%' OR LOWER(z.ul_instalacji) LIKE '%koł%' OR LOWER(z.miasto_kod_instalacji) LIKE '%koł%' AND z.pakiet = p.id_pakietu AND z.priorytet = r.id_priorytetu
  4. GROUP BY id_zamowienia
  5. ORDER BY id_zamowienia


i nie wiem dlaczego zawsze dostaje błędne - takie same wartości na polu Priorytet i Pakiet, wsyztskie są równe pierwszemu wierszowi odpowiednio w tabeli Priorytety oraz Pakiety.
gdzie mam błąd?
ten_typ
Wydaje mi się, że błąd leży tutaj:
  1. FROM zamowienia z, pakiety p, priorytety r


Wybierając rożne kolumny z różnych tabel powinieneś skorzystać z INNER JOIN (ewentualnie LEFT albo RIGHT JOIN).
Schemat:
  1. FROM tabela_1 INNER JOIN tabela_2 USING (nazwa pozycji, poprzez którą tabela 1 i tabela 2 łączą się ze sobą) INNER JOIN tabela_3 USING (nazwa pozycji, poprzez którą tabela 2 i tabela 3 łączą się ze sobą) WHERE


I proponuje zmienić nazwe tabel żeby nie występowały spacje - zamowienia_z, pakiety_p, priorytety_r

Pozdrawiam.
kitol
Nie przedstawiłeś struktury tabel i łączących je relacji, więc nie spodziewaj się dokładnej podpowiedzi. Na pierwszy rzut oka wydaje mi się, że brakuje nawiasów w WHERE. Nie powinno być czasem coś w stylu:
  1. (LOWER(z.imie_nazwisko) LIKE '%koł%' OR LOWER(z.ul_instalacji) LIKE '%koł%' OR LOWER(z.miasto_kod_instalacji) LIKE '%koł%') AND z.pakiet = p.id_pakietu AND z.priorytet = r.id_priorytetu


mysz0n: Przecież nazwy tych tabel nie zawierają spacji z, p, r są aliasami dla każdej z tabel
mysz0n
kitol ja wiem że to są aliasy - powinieneś to napisać go tego_typa:]
ten_typ są 2 opcje łączenia ze sobą tabel - albo za pomocą LEF czy RIGHT JOINa albo w taki sposób jak ja to zrobiłem - ma to jakąś swoją nazwe ale szkołę już jakiś czas temu skończyłem i używam tego a nie zastanawiam się nad nazewnictwem.
kitol co do struktury - myślę ze jest to częściowo widoczne:
główną tabelą jest tabela zamówienia a w niej klucz główny ID_ZAMÓWIENIA,
kolumna pakiety łączy się z zamówieniami poprzez kolumne PAKIET-w zamówieniach i ID_PAKIETU w tabeli pakiety,
następnie koumna PRIORYTET w zamówieniach jest jednoznaczna z kolumną ID_PRIORYTETU w tabeli priorytety.
kurde nie wiem czy to jest nieco jaśniejsze - jak nie mogę jakiegos małego jotpega wrzucić zeby wyjaśnić
kitol
Cytat
kitol ja wiem że to są aliasy - powinieneś to napisać go tego_typa:]

Sorki. To miało być do tego_typa:)

Nadal myślę że bład powoduje brak nawiasów. Wykonaj to przykładowe zapytanie:
  1. SELECT 1 OR 0 OR 0 AND 0 AND 0

W sensie logicznym jest równoważne warunkowi WHERE z twojego zapytania. Jak widzisz wystarczy spełnienie przynajmniej jednego warunku z LIKE aby wiersze zostały złączone, nawet wtedy gdy z.pakiet != p.id_pakietu lub z.priorytet != r.id_priorytetu. Potrzebujesz nawiasów. Dla porównania sprawdź:
  1. SELECT (1 OR 0 OR 0) AND 0 AND 0


kolega ten_typ ma rację lepiej jest łączyć tabele przez JOIN. Wówczas warunki złaczenia są lepiej widoczne dla każdej z tabel.
mysz0n
miałeś rację kitol problemem była logika zapytania, tak to jest jak sie pisze zapytania częściami, najpierw chcialem tylko wyświetlac, potem dodałem inne tabele, potem wyszukiwarke - i zapomnialem/przeoczylem/niezwrocilem uwagi.
co do tworzenia aliasów lub składania poprzez JOIN - czy jest jakaś róznica w optymalizacji dla serwera bazodanowego? bo jeśli nie - to wole tą metodę której używam - jeśli tak - przesiąde się na JOINy
jeszcze raz dzieki kitol
kitol
Uczono mnie, że zapytanie w formie:
  1. ... FROM tabela1, tabela2, tabela 3...

tworzy tabelę tymczasową o wielkości iloczynu kartezjańskiego (ilość wierszy tabeli1 x il. w. tabeli2 x tabela3), tak więc do tabeli tymczasowej wkładane są wszystkie możliwe kombinacje wierszy z trzech tabel. W przypadku gdy każda tabele mają po 100 wierszy, tabela tymczasowa będzie ich miała 1.000.000. Z tego zazwyczaj 99.99% jest następnie eliminowane poprzez klauzulę WHERE. W przypadku użycia JOIN do tabeli tymczasowej branę są tylko pasujące do siebie rekordy, czyli tworzona jest tabela o ilości rekordów równej 100.
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.