Cytat(johnson @ 2005-05-22 22:05:36)
Spróbuje nieco bardziej zobrazować o co mi chodzi.
id | domena | url | rate |
1 | www.php.pl | www.php.pl/strona2 | 90
2 | www.php.pl | www.php.pl/strona1 | 30
3 | www.php.pl | www.php.pl/strona4 | 70
4 | www.php.pl | www.php.pl/strona3 | 100
5 | forum.php.pl | forum.php.pl/strona3 | 20
6 | forum.php.pl | forum.php.pl/strona2 | 50
7 | forum.php.pl | forum.php.pl/strona1 | 60
Jakie pytanie należy zadać aby otrzymać 2 rekordy:
4 | www.php.pl | www.php.pl/strona3 | 100
7 | forum.php.pl | forum.php.pl/strona1 | 60
Da rade, aczkolwiek juz sobie nie uzyjesz funkcji grupujacych, bo rozwiazanie nie opiera sie na grupowaniu (widzialem gdzies w necie rozwiazanie tego z grupowaniem).
A wiec:
SELECT t1.*
FROM tabela t1
LEFT JOIN tabela t2 ON (t1.domena = t2.domena AND t1.rate < t2.rate)
WHERE t2.id IS NULL
Nie sprawdzilem, bo nie mam danych, ale chyba powinno byc dobrze. Taki calkiem przydatny trick.. tylko koniecznie trzeba zalozyc indeks na pole, po ktorym "grupujemy".
---edit:
Powalczylem chwile i doszedlem jak uruchomic tu jeszcze grupowanie...
SELECT t1.*, COUNT(t3.article) ile, MIN(t3.price) min FROM shop t1
LEFT JOIN shop t2 ON (t1.article = t2.article AND t1.price < t2.price)
INNER JOIN shop t3 ON (t1.article = t3.article)
WHERE t2.article IS NULL
GROUP BY t3.article
To jest na innych danych, bo akurat taka tabele mialem pod reka do testow, ale sytuacja jest analogiczna do tej powyzszej.
Tabela i dane:
Kod
article | dealer | price
0001 A 3.45
0001 B 3.99
0002 A 10.99
0003 B 1.45
0003 C 1.69
0003 D 1.25
0004 D 19.95
Jak widac wyciagnelismy wiersz z najwyzsza cena dla danego artykulu, jednoczesnie umozliwiajac sobie wyciagniecie ilosci wierszy w tej grupie artykulow oraz najmniejszej ceny.
Wynik:
Kod
article dealer price ile min
0001 B 3.99 2 3.45
0002 A 10.99 1 10.99
0003 C 1.69 3 1.25
0004 D 19.95 1 19.95