Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> SELECT TOP 'n' RECORDS FROM EACH CATEGORY?
nTiger
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 11.09.2014

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


Witam, od paru dni probuje i probuje rozwiazac problem na ktory sie natknalem i stoje w miejscu, mianowicie potrzebuje uzyskac 2 rekordow o najnizszym czasie z kazdej kategorii.

Moje tabele wygladaja o tak:
  1. sr_id | category | map | time | short
  2. 0 100 map1 100 0
  3. 0 100 map1 200 0
  4. 0 100 map1 300 0
  5. 0 100 map2 100 0
  6. 0 100 map2 200 0
  7. 0 100 map2 300 0
  8. 0 200 map1 100 0
  9. 0 200 map1 200 0
  10. 0 200 map1 300 0
  11. 0 200 map2 100 0
  12. 0 200 map2 200 0
  13. 0 200 map2 300 0
  14. 0 333 map1 100 0
  15. 0 333 map1 200 0
  16. 0 333 map1 300 0
  17. 0 333 map2 100 0
  18. 0 333 map2 200 0
  19. 0 333 map2 300 0


chce wybrac po 2 najlepsze czasy z tabeli 'time' z kazdej kategorii z tabeli 'category', gdzie tabela 'map' = 'map1' czyli powinno to wygladac nastepujaco:

  1. sr_id | category | map | time | short
  2. 0 100 map1 100 0
  3. 0 100 map1 200 0
  4. 0 200 map1 100 0
  5. 0 200 map1 200 0
  6. 0 333 map1 100 0
  7. 0 333 map1 200 0


udalo mi sie wykonac 2 sposoby, lecz zaden nie dziala tak jak powinien, wygladaja one o tak:

  1. SELECT tabela_times.* FROM tabela_times JOIN (SELECT t1.category, t1.time, COUNT(t2.category) AS theCount
  2. FROM tabela_times t1 LEFT JOIN tabela_times t2 ON t1.category = t2.category AND t1.time > t2.time
  3. GROUP BY t1.category, t1.time ASC
  4. WHERE (theCount < 2)) AS dt USING (category, time);


To akurat smiga bez zazuty, lecz wyszukuje on z kazdej mapy, a ja potrzebuje tylko z mapy 'map1', wiem ze mogl bym dodac " WHERE map = 'map1' ", ale nie mam pojecia w ktorym miejscu to dodac.

Mam takze 2 rozwiazanie ktore dziala bez problemu: (ale)

  1. SET @oldGroup := 0, @count := 0; SELECT @oldGroup := category, tabela_times.* FROM tabela_times HAVING map = 'map1' AND short = '1' AND (@count := IF(category <=> @oldGroup, @count+1, 0)) < 15 ORDER BY category, time ASC;


ale przez to ze jest wywolana funkcja ( SET @oldGroup := 0, @count := 0; ) przed 'SELECT' moj plugin nie akceptuje juz niczego innego

Ten post edytował nTiger 11.09.2014, 10:01:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nTiger
post
Post #2





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 11.09.2014

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


Cytat(Pyton_000 @ 11.09.2014, 11:53:43 ) *
Bo masz wykonać 2 zapytania oddzielnie, zapewne wrzucasz w PHP oba te zapytania razem.


Nie, nie robie tego w PHP, robie to w AMX MOD X


Cytat(mmmmmmm @ 11.09.2014, 12:05:03 ) *
Dużo masz tych rekordów? Można to zrobić w czystym sql, ale może "trochę" zabić MySQL-a.


No moze byc ich i 5,000+

Problem zalatwiony:

  1. SELECT tabela_times.* FROM tabela_times JOIN (SELECT t1.category, t1.time, SUM(case when t2.map = 'map1' THEN 1 ELSE 0 end) AS theCount
  2. FROM speedrun_v2_times t1 LEFT JOIN tabela_times t2 ON t1.category = t2.category AND t1.time > t2.time
  3. GROUP BY t1.category, t1.time
  4. HAVING (theCount < 1)) AS dt USING (category, time) WHERE map = 'map1' ORDER BY time ASC;


Ten post edytował nTiger 11.09.2014, 18:39:21
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.10.2025 - 09:57