Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] problem z zapytaniem
motorolka24
post
Post #1





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 21.04.2007

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


Dlaczego w tym zapytanie nie bierze mi pod uwagę sortowania? Wydaje sie ze jest wszystko dobrze a jednak zle bo nie sortuje.
  1. SELECT produkt.id, produkt.nazwa, produkt.cena, produkt.opis, produkt.ogladalnosc, produkt.dostepne
  2. FROM produkt, produkt_kategoria WHERE produkt.dostepne=true AND produkt.nazwa LIKE '%aa%' OR produkt.opis LIKE '%aa%' AND produkt_kategoria.kategoria_id=12 AND produkt.id=produkt_kategoria.produkt_id GROUP BY produkt.id ORDER BY produkt.id DESC LIMIT 0, 20
Go to the top of the page
+Quote Post
grzegorz_m
post
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 1
Dołączył: 10.07.2008
Skąd: Łódź

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


Czy produkt.id jest unikatowe? Domyślam się, że to klucz główny... Czy tak rzeczywiście jest?

Jeśli w tabeli produkt mamy kolumnę id i każdy jej rekord jest unikatowy, to jaki jest sens stosowania GROUP BY na tej kolumnie? Może chciałeś tam wpisać GROUP BY produkt.nazwa?!

Zrobiłem 2 przykładowe tabele (coś jak u Ciebie) i wszystko działa tak jak powinno. Oczywiście ja pytałem o coś innego -chciałem wyłonić ilość produktów o identycznej nazwie oraz których nazwa jest w tabeli "kategoria".

  1. SELECT prod.nazwa AS 'nazwa', count(*) AS 'ilość'
  2. FROM produkt AS prod, produkt_kategoria AS kat
  3. WHERE prod.nazwa = kat.nazwa
  4. GROUP BY prod.nazwa
  5. ORDER BY prod.nazwa DESC


W wyniku mam:

  1. nazwa | ilość
  2. b 1
  3. a 2


Jak widać działa zgodnie z zamierzeniem. Pytanie czego Ty tak naprawdę oczekiwałeś po swoim zapytaniu.

Podsumowując uważam, że błąd jest po klauzuli GROUP BY -mam nadzieję, że to pomoże


P.S.

Radzę stosować aliasy.
Go to the top of the page
+Quote Post
motorolka24
post
Post #3





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 21.04.2007

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


Dałam GROUP BY bo nie wiadomo czemu zapytanie zwracając mi wynik powtarza niektóre rekordy po pare razy. Wiesz może dlaczego?
Go to the top of the page
+Quote Post
grzegorz_m
post
Post #4





Grupa: Zarejestrowani
Postów: 22
Pomógł: 1
Dołączył: 10.07.2008
Skąd: Łódź

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


Zwraca ponieważ jest ich wiele -zastosuj distinct, który eliminuje duplikaty.

Ewentualnie przedstaw strukturę tabel produkt, produkt_kategoria oraz to czego konkretnie oczekujesz od zapytania, a ja pomogę Ci napisać to zapytanie poprawnie. Chyba, że distinct rozwiąże sprawę...



P.S.

Odradzam pisania zapytań sql na zasadzie prób i błędów. Musisz dokładnie wiedzieć czego od niego oczekujesz i co to zapytanie zwróci. Jeżeli będziesz strzelał to faktycznie może zadziałać ...na jakiś czas, a po kilku miesiącach wyskoczy problem, którego nie będziesz w stanie zdiagnozować (może to coś z bazą, może to coś z aplikacją, a może...).


Pozdrawiam
Go to the top of the page
+Quote Post
motorolka24
post
Post #5





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 21.04.2007

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


produkt
---------
id
nazwa
cena
opis
ogladalnosc
dostepne

produkt_kategoria
-------------------
id
kategoria_id
produkt_id

kategoria
----------
id
nazwa

i chce wyświetlić produkt.id, produkt.nazwa, produkt.cena, produkt.opis, produkt.ogladalnosc, produkt.dostepne dla produktów które zawierają jakiś tekst w nazwie lub opisie oraz są przypisane do wybranej kategorii
Go to the top of the page
+Quote Post
grzegorz_m
post
Post #6





Grupa: Zarejestrowani
Postów: 22
Pomógł: 1
Dołączył: 10.07.2008
Skąd: Łódź

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


Cytat
które zawierają jakiś tekst w nazwie lub opisie

Czy chodzi o tekst jako litery a nie same cyfry? Czy chodziło Ci o to, że po prostu nie może być to wartość NULL (czyli pole nie może być puste)? A może jednak (na co wskazuje Twoje wcześniejsze zapytanie do bd) chodzi o wskazanie tekstu, który powinien w nich występować np. "at" -niezależnie czy będzie to "automAT", "laminAT", "ATrament", "hp AT3432", ...

I żeby nie przeciągać sprawy napiszę jak to powinno wyglądać przy założeniach:

1) poszukujemy wszystkiego z tabeli produkt

a ) gdzie: nazwa zawiera dwie litery "a" w kupie -np. "taat" LUB opis zawiera "ola" czyli np. "Cola light".

b ) ORAZ: id danego produktu (tego, który przeszedł weryfikację w punkcie a) znajduje się w tabeli produkt_kategoria

  1. SELECT *
  2. FROM produkt AS p
  3. WHERE (p.nazwa LIKE '%aa%' OR 
  4.   p.opis LIKE '%ola%') AND 
  5.   p.id IN (
  6.   SELECT produkt_id 
  7.   FROM produkt_kategoria
  8.   )
  9. ORDER BY p.id




pozdrawiam

Ten post edytował grzegorz_m 17.12.2008, 12:03:34
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: 1.10.2025 - 07:02