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
mmmmmmm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  1. /*
  2. create table _mm_test
  3. (id int not null auto_increment primary key,
  4. sr_id int not null,
  5. category int not null,
  6. map varchar(10) not null,
  7. time int not null,
  8. short int not null);
  9.  
  10. insert into _mm_test(sr_id, category, map, time, short) values
  11. (0, 100, 'map1', 100,0),
  12. (0, 100, 'map1', 200,0),
  13. (0, 100, 'map1', 300,0),
  14. (0, 100, 'map2', 100,0),
  15. (0, 100, 'map2', 200,0),
  16. (0, 100, 'map2', 300,0),
  17. (0, 200, 'map1', 100,0),
  18. (0, 200, 'map1', 200,0),
  19. (0, 200, 'map1', 300,0),
  20. (0, 200, 'map2', 100,0),
  21. (0, 200, 'map2', 200,0),
  22. (0, 200, 'map2', 300,0),
  23. (0, 333, 'map1', 100,0),
  24. (0, 333, 'map1', 200,0),
  25. (0, 333, 'map1', 300,0),
  26. (0, 333, 'map2', 100,0),
  27. (0, 333, 'map2', 200,0),
  28. (0, 333, 'map2', 300,0);
  29. */
  30. SELECT sr_id, category, map, time, short FROM
  31. (
  32. SELECT *, (SELECT count(*) FROM _mm_test WHERE map=t.map AND category=t.category AND time<t.time) ranking FROM _mm_test t WHERE map='map1'
  33. ) sub
  34. WHERE ranking<2
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: 7.10.2025 - 10:29