Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie SQL dla Optymalizacji
webJ@cob
post 23.11.2010, 21:49:41
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
Go to the top of the page
+Quote Post
nospor
post 23.11.2010, 21:53:29
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

Go to the top of the page
+Quote Post
webJ@cob
post 24.11.2010, 14:07:20
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 winksmiley.jpg


--------------------
Sprawdź kiedy marzenia stają się inspiracją.
e-Zarządzania firmą | e-Biznes | Strony.Serwisy.Portale Internetowe
www.webarts.pl
Go to the top of the page
+Quote Post
adk11
post 3.12.2010, 13:58:51
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 smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.06.2025 - 02:13