[MySQL] Wybranie po n zdjęć z każdej kategori

0

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.

0
  1. SELECT pole FROM tabela LIMIT 3;
  2. http://www.w3schools.com/SQl/sql_join.asp
0

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.

0

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.

0

A możecie powiedzieć jak działa COUNT(*)?

0

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 ;

0
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.

0

Teraz pytam czy to dobre rozwiązanie, może ktoś zna lepsze ?

0

imho źle.

0

Dlaczego ?

0

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...

0

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.

0

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.

0

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);

0

"#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' "

0

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);
0

Ok, dzięki.

0

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

0

Mysql nie daje rady,
jak masz mało rekordów możesz zastować zapytanie podane przeze mnie.

0

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 ...

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1