Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie SQL dla Optymalizacji
Forum PHP.pl > Forum > Bazy danych > MySQL
webJ@cob
Witam,

Staram się opracować zapytanie SQL dla MYSQL 5.0

Mam tabele z artykulami gdzie jednym z parametrów jest id_category (int) zawierający id kategorii artykułu.
W bazie jest ponad 4000 artykułów i zależy mi aby wynik był następujący:
- dla wszystkich id_category (SELECT DISTINCT id_category FROM `artykuly`) wybrać z bazy po 5 artykułów dla każdego id_category

Czyli tak aby miec 5 artów dla id_category = 1,2,5,8,10,12,15 (gdzie 1....15 to id_category)

W ten sposób nie będę musiał pobierać dla każdej kategorii wszystkie artykuły tylko 5 pierwszych.
nospor
http://nospor.pl/grupowanie-wynikow.html#comments
Zacznij czytać od komentarza gosc_Patryk - masz tam odpowiedź na swoje pytanie
webJ@cob
Dziękuję i pozdrawiam winksmiley.jpg
adk11
Może się komuś sprzyda.

Pierwsze zapytanie ma jedną wadę, otóż subselect musi pobrać wszystkie rekordy i ponumerować od 1 do n, dopiero w selekcie zewnętrznym są brane interesujące nas wyniki w naszym przypadku do 2 odpowiedzi na posta.

mysql> SELECT forumId, parentForumId from (
-> SELECT forumId, parentForumId, IF( @tmp <> parentForumId, @row := 1, @row := @row + 1 ) AS row_number, @tmp := parentForumId from `groupForum` where parentForumId in(30,31) order by parentForumId asc) t
-> WHERE t.row_number <= 2;
+---------+---------------+
| forumId | parentForumId |
+---------+---------------+
| 106 | 30 |
| 134 | 30 |
| 632 | 31 |
| 638 | 31 |
+---------+---------------+
4 rows in set (0.00 sec)

mysql> set @row = 0,@tmp=0;
Query OK, 0 rows affected (0.00 sec)

Wynik można uzyskać przenosząc liczenie odpowiedzi do where, zysk mamy taki że jeżeli @row przekracza 2 pomijane są następne rekordy aż napotkamy następny post i liczenie zacznie się od nowa

mysql> SELECT forumId, @tmp := parentForumId as parentForumId from `groupForum`
-> where parentForumId in(30,31) and IF( @tmp <> parentForumId, @row := 1, @row := @row + 1 ) <=2 order by parentForumId asc;
+---------+---------------+
| forumId | parentForumId |
+---------+---------------+
| 106 | 30 |
| 134 | 30 |
| 632 | 31 |
| 638 | 31 |
+---------+---------------+
4 rows in set (0.00 sec)

Ten sposób można wykorzystać zamiast GROUP BY lub DISTINCT i całkiem dobrze sobie to radzi smile.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.