Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Zapytanie SQL z GROUP BY
Forum PHP.pl > Forum > Przedszkole
SQL
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.
nospor
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
SQL
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
nospor
a o OR nie slyszales?
nie: ... AND op.nazwa='b' AND op.nazwa='c'
a: ... AND (op.nazwa='b' or op.nazwa='c')
SQL
Ale ja chce znaleźć produkty które mają a i b, a nie a lub b...
nospor
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
SQL
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
nospor
w jakim sensie nie dziala? Wali bledem zapytania czy daje niepozadane wyniki? Moze pokaz strukture tabel i przykladowe dane to bedzie latwiej
SQL
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 )
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.