Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL] Zapytanie SQL z GROUP BY, problem z zapytaniem
-SQL-
post 28.04.2008, 00:58:48
Post #1





Goście







Mam coś takiego:

  1. SELECT *, SUM(cena * (SELECT kurs FROM waluty WHERE nazwa=waluta)) AS cenakursowa
  2. FROM tabela WHERE nazwa='xx'
  3. GROUP BY id
  4. ORDER BY nazwa
  5. LIMIT 0, 15


To zapytanie przelicza mi po aktualnym kursie waluty cenę danego produktu.

W innej tabeli są przechowywane dodatkowe opcje (np. produkt ma: a,b,c - i chce rozszerzyć wyszukiwanie o produkty które mają np. tylko B) - zrobiłem coś takiego:

  1. SELECT *, SUM(ta.cena * (SELECT kurs FROM waluty WHERE waluty.nazwa=ta.waluta)) AS cenakursowa
  2. FROM tabela AS ta LEFT JOIN opcje AS op ON ta.nazwa='xx' AND ta.id=op.tabela_id AND op.nazwa='b'
  3. GROUP BY ta.id
  4. ORDER BY nazwa
  5. LIMIT 0, 15


Ale niestety zwraca mi również wyniki które nie mają "b".

Z góry dziękuje za pomoc w rozwiązaniu tego problemu.
Go to the top of the page
+Quote Post
nospor
post 28.04.2008, 10:14:02
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nie dales where a jedynie warunki na zlaczenie
  1. SELECT *, SUM(ta.cena * (SELECT kurs FROM waluty WHERE waluty.nazwa=ta.waluta)) AS cenakursowa
  2. FROM tabela AS ta LEFT JOIN opcje AS op ON ta.id=op.tabela_id WHERE ta.nazwa='xx' AND op.nazwa='b'
  3. GROUP BY ta.id
  4. ORDER BY nazwa
  5. LIMIT 0, 15

Mniej wiecej cos takiego


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-SQL-
post 28.04.2008, 10:39:50
Post #3





Goście







Cytat(nospor @ 28.04.2008, 10:14:02 ) *
nie dales where a jedynie warunki na zlaczenie
  1. SELECT *, SUM(ta.cena * (SELECT kurs FROM waluty WHERE waluty.nazwa=ta.waluta)) AS cenakursowa
  2. FROM tabela AS ta LEFT JOIN opcje AS op ON ta.id=op.tabela_id WHERE ta.nazwa='xx' AND op.nazwa='b'
  3. GROUP BY ta.id
  4. ORDER BY nazwa
  5. LIMIT 0, 15

Mniej wiecej cos takiego


Niestety ale działa to tylko dla jednego warunku - jeśli chce znaleźć produkty które mają 'b' i 'c' to już nie zwraca żadnych wyników

  1. SELECT *, SUM(ta.cena * (SELECT kurs FROM waluty WHERE waluty.nazwa=ta.waluta)) AS cenakursowa
  2. FROM tabela AS ta LEFT JOIN opcje AS op ON ta.id=op.tabela_id WHERE ta.nazwa='xx' AND op.nazwa='b' AND op.nazwa='c'
  3. GROUP BY ta.id
  4. ORDER BY nazwa
  5. LIMIT 0, 15
Go to the top of the page
+Quote Post
nospor
post 28.04.2008, 10:41:40
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




a o OR nie slyszales?
nie: ... AND op.nazwa='b' AND op.nazwa='c'
a: ... AND (op.nazwa='b' or op.nazwa='c')


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-SQL-
post 28.04.2008, 10:56:55
Post #5





Goście







Ale ja chce znaleźć produkty które mają a i b, a nie a lub b...
Go to the top of the page
+Quote Post
nospor
post 28.04.2008, 11:31:16
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nie zajarzylem od razu smile.gif

  1. SELECT *, SUM(ta.cena * (SELECT kurs FROM waluty WHERE waluty.nazwa=ta.waluta)) AS cenakursowa
  2. FROM tabela AS ta LEFT JOIN opcje AS op ON (ta.id=op.tabela_id AND (op.nazwa='b' OR op.nazwa='c')) WHERE ta.nazwa='xx'
  3. GROUP BY ta.id HAVING count(op.tabela_id)>1
  4. ORDER BY nazwa
  5. LIMIT 0, 15

Bodajze cos takiego


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-SQL-
post 28.04.2008, 12:07:49
Post #7





Goście







Cytat(nospor @ 28.04.2008, 11:31:16 ) *
nie zajarzylem od razu smile.gif

  1. SELECT *, SUM(ta.cena * (SELECT kurs FROM waluty WHERE waluty.nazwa=ta.waluta)) AS cenakursowa
  2. FROM tabela AS ta LEFT JOIN opcje AS op ON (ta.id=op.tabela_id AND (op.nazwa='b' OR op.nazwa='c')) WHERE ta.nazwa='xx'
  3. GROUP BY ta.id HAVING count(op.tabela_id)>1
  4. ORDER BY nazwa
  5. LIMIT 0, 15

Bodajze cos takiego


Dzięki za pomoc, ale niestety to też nie działa sadsmiley02.gif
Go to the top of the page
+Quote Post
nospor
post 28.04.2008, 12:09:30
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




w jakim sensie nie dziala? Wali bledem zapytania czy daje niepozadane wyniki? Moze pokaz strukture tabel i przykladowe dane to bedzie latwiej


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-SQL-
post 28.04.2008, 12:24:01
Post #9





Goście







Daje złe wyniki Twoje zapytanie.

waluty:
id | nazwa | kurs
1 | USD | 2.5

allOpcje:
id | nazwa
1 | mp3
2 | CD
3 | USB

opcje:
id | id_tabela | id_opcje
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3

produkty
id | nazwa | marka | model | ...
1 | TV | Sony | X | ...
2 | radio | Watson | X2 | ...

chce znaleść wszystkie produkty marki sony które mają mp3 i przy okazji obliczyć aktualną cenę dzięki czemu mam możliwość sortowania ceną (co całą resztę komplikuje sad.gif )
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 03:48