Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z zapytaniem, ...
fido20
post
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.03.2003
Skąd: Białystok

Ostrzeżenie: (0%)
-----


Witam,

Mam tabele

| IdPorduktu | IdKategorii | NazwaProduktu | DataDodania |

Chce z niej wyciągnąć po 5 produktów dla każdego id_kategorii posortowane według DataDodanie Desc (5 najnowszych prodktów dla każdej z kategorii)
Czy jest to mozliwe w jednym zapytaniu ?
Go to the top of the page
+Quote Post
kicaj
post
Post #2





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


Tytuluj tematy bardziej opisowo...

Odp. Tak
Go to the top of the page
+Quote Post
prond
post
Post #3





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Możliwe, ale w MySQL wcale nie takie proste. To, co chcesz osiągnąć wymaga funkcji rankingujących, których nie ma w MySQL.
Można to obejść wykorzystując zmienne:
  1. SET @intRank := 0;
  2. SET @intLastCategoryId := 0;
  3. SELECT
  4. *
  5. FROM ( SELECT
  6. products.*,
  7. CASE
  8. WHEN @intLastCategoryId <> products.category_id
  9. THEN @intRank := 1
  10. ELSE @intRank := @intRank + 1
  11. END AS rank,
  12. @intLastCategoryId := products.category_id
  13. FROM products ORDER BY
  14. products.category_id
  15. ) AS t
  16. WHERE t.rank < 6;
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(kicaj @ 20.12.2007, 20:23:36 ) *
Odp. Tak

Tak? W takim razie proszę napisz mi takowe zapytanie - będę naprawdę wdzięczny.
Mój MySQL (5.0.26) krzyczy:
Kod
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery

Więc może jeśli nie znasz rozwiązania to nie wprowadzaj ludzi w błąd.
Go to the top of the page
+Quote Post
nevt
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


Cytat
Tak? W takim razie proszę napisz mi takowe zapytanie - będę naprawdę wdzięczny.
Mój MySQL (5.0.26) krzyczy:
KodThis version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
Więc może jeśli nie znasz rozwiązania to nie wprowadzaj ludzi w błąd.

och... ludzie małej wiary, proszę oto kod działającvy w MySQL...
dla uproszczenia zapisu przyjmijmy:
idProduktu = pid
idKategorii = cid
dataDodania = dd
a tabelka to po prostu `tabela`:
  1. SELECT * FROM tabela AS a
  2. WHERE (SELECT COUNT(cid) FROM tabela AS b WHERE (b.dd > a.dd) AND (b.cid = a.cid)) < 5;

oczywiście zamiast 5 można wstawić dowolną inną liczbę.
i kto tu kogo wprowadza w błąd??
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@nevt: Jeśli Twoje rozwiązanie faktycznie działa (a nie mam jak sprawdzić) to cofam moją wypowiedź i idę schować się do szafy.
(IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif) (IMG:http://forum.php.pl/style_emoticons/default/brzydal.gif) (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Go to the top of the page
+Quote Post
prond
post
Post #7





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@nevt : Ciekawe podejscie do tego problemu. Nie wpadlem nigdy na to, bo probowalem to zrobic tak jak w ORACLE (rank() over partition). Przetestowalem sobie Twoje zapytanie - dziala pieknie, ale jest jeden problem - dla ok. 6mln rekordow robi sie bardzo bardzo wolne. Pewnie dlatego, ze podzapytanie w WHERE budowane jest dla kazdego rekordu, a dla tego podzapytania MySQL nie wykorzystuje INDEX'ow.

Rozwiazanie ze zmiennymi tez nie jest najlepsze, ale sa tylko 2 loopy przez cala tabelke i lata duzo szybciej.
Go to the top of the page
+Quote Post
nevt
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


to oczywiste że moja konstrukcja jest nieoptymalna - sam ją stosuję tylko na b. krótkich tabelkach...
chodziło tylko o demonstrację, że jest to technicznie możliwe w jednym zapytaniu, bez zmiennych pomocniczych i pętli...

pozdrawiam wszystkich.
Go to the top of the page
+Quote Post
fido20
post
Post #9





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 10.03.2003
Skąd: Białystok

Ostrzeżenie: (0%)
-----


Dzięki wszystkim za zainteresowanie i pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 22:51