![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 66 Pomógł: 1 Dołączył: 28.02.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- Sprawdź kiedy marzenia stają się inspiracją.
e-Zarządzania firmą | e-Biznes | Strony.Serwisy.Portale Internetowe www.webarts.pl |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
http://nospor.pl/grupowanie-wynikow.html#comments
Zacznij czytać od komentarza gosc_Patryk - masz tam odpowiedź na swoje pytanie -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 66 Pomógł: 1 Dołączył: 28.02.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję i pozdrawiam
![]() -------------------- Sprawdź kiedy marzenia stają się inspiracją.
e-Zarządzania firmą | e-Biznes | Strony.Serwisy.Portale Internetowe www.webarts.pl |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 2.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.06.2025 - 02:13 |