Mam prostą bazę danych tzn kategorie (id,nazwa) i zdjecia(id, nazwa, id_kategori)
Jak można w jednym zapytaniu pobrać listę na której będzie np po maks 3 z kadej kategorii, a przy każdym zdjęciu id, nazwa zdjęcia i nazwa kategori.
Pozdrawiam.
Mam prostą bazę danych tzn kategorie (id,nazwa) i zdjecia(id, nazwa, id_kategori)
Jak można w jednym zapytaniu pobrać listę na której będzie np po maks 3 z kadej kategorii, a przy każdym zdjęciu id, nazwa zdjęcia i nazwa kategori.
Pozdrawiam.
SELECT pole FROM tabela LIMIT 3;
Jak zrobie join i limit to mi da np 3 wyniki,
a potrzebuje listę o pozycjach :
nazwa_kategori, nazwa zdjęcia
ale żeby na liście były po maks 3 zdjęcia z każdej kategorii.
Obawiam się, że jednym zapytaniem tego nie zrobisz. Możesz poeksperymentować z union ale wtedy musiałbyś generować zapytanie na podstawie zawartości kategorie
Edytka:
I zapytania składowe trzeba by brać w nawiasy, inaczej ostatni limit sieknie po wszystkim, i wyjdzie to co powyżej.
A możecie powiedzieć jak działa COUNT(*)?
Masz po polsku: http://74.125.43.132/translate_c?hl=pl&sl=en&u=http://www.w3schools.com/SQl/sql_func_count.asp&prev=/search%3Fq%3Dsql%26hl%3Dpl%26client%3Dopera%26rls%3Dpl%26hs%3DOmq&rurl=translate.google.pl&usg=ALkJrhiVxEWteT-9sQ_g1SDFHn9ce4MxoA i oryginalny tekst http://www.w3schools.com/SQl/sql_func_count.asp
To może tak
SELECT c.name,c.path, p.name FROM kategories c JOIN photos p ON (c.id = p.id_kat)
JOIN photos p2 ON (c.id=p2.id_kat AND p2.id >=p.id)
GROUP BY c.id, p.id
HAVING COUNT(*) <=4 ;
tomii napisał(a)
To może tak ...
Skomentuję to tak:
Masz bazę wypełnioną danymi (oby), wydziergałeś zapytanie, i zamiast sprawdzić czy działa na tej bazie, to nas się o to pytasz. [rotfl]
Sam osobiście z JOIN rzadko korzystam, więc nie za bardzo mogę przewidzieć jak się zachowa, szczególnie z takim zastosowaniem count'a.
Teraz pytam czy to dobre rozwiązanie, może ktoś zna lepsze ?
imho źle.
Dlaczego ?
Klauzula HAVING usuwa z wyniku te grupy, których wartość przekroczyła 4. Ty z kolei chyba chciałeś dostać pierwsze 3 wyniki z każdej kategorii...
zapytanie wydaje się działać poprawnie , zdjęcia z każdej kategorii są numerowane od 1 , następnie wybieramy tylko te co mają mają numer poniżej 4.
To nie count() <= 4 tylko id < 4. Bo dla count() <=4 wyświetli Ci tylko te wpisy, których dla danej kategorii będzie mniej niż 5.
To zapytanie jest nieprawidłowe ponieważ dubluje rekordy. Przykładowo jeżeli będziesz miał 10 kategorii po 10 zdjęć w każdej czyli razem 100 zdjęć to zapytanie będzie grupowało 550 rekordów i ostatecznie zwróci to co chcesz ale w bardzo mało wydajny sposób. Jak nie wierzysz to wykonaj swoje zapytanie bez GROUP BY i HAVING i zobacz ile rekordów zwróci.
Poprawne zapytanie:
SELECT c.name, c.path, p.name
FROM kategories c
INNER JOIN photos p ON c.id = p.id_kat
WHERE p.id IN (SELECT p.id FROM photos p WHERE p.kat_id = c.id LIMIT 3);
"#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' "
Jeżeli dostajesz taki komunikat to znaczy, że MySQL jest do d***, przesiądź się na jakąś normalną bazę.
Trzeba zastosować trick i oszukać MySQL w ten sposób, powinno zadziałać.
SELECT c.name, c.path, p.name
FROM kategories c
INNER JOIN photos p ON c.id = p.id_kat
WHERE p.id IN (SELECT X.* FROM (SELECT p.id FROM photos p WHERE p.kat_id = c.id LIMIT 3) AS X);
Ok, dzięki.
nie wiem czy mysql jest az tak do d**y czy ja cos robię źle ale teraz mysql
nie widzi w podzapytaniu c.id przy: WHERE p.kat_id = c.id
Mysql nie daje rady,
jak masz mało rekordów możesz zastować zapytanie podane przeze mnie.
Właśnie rekordów to mam mnóstwo... chyba zostanę przy zapytaniu do każdej kategorii zwłaszcza że u mnie jeszcze by były inny join i do tego sortowania ...
Ja myślałem że jak np uzywasz tego w php to możesz na początek pobrać listę kategorii potem php może zbudować zapytanie na UNION.