Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] zapytanie z podzapytaniami
Forum PHP.pl > Forum > Przedszkole
kleszczoscisk
Witam

Przedsięwzięcie non profit (fundacja).
Proszę o pomoc w sformułowaniu zapytania (zapytań) bo mi się przepala mózg (nie jestem programistą). Muszę wyciągnąć i zaprezentować dane z tabeli, w której przechowywane są głosowania zalogowanych użytkowników na obrazy. Każdy użytkownik ma prawo 1 głosu w każdej kategorii. W sumie 5 głosów. Kategorii 5. Obrazów w kategorii ~100.
Głosy przechowuję w tabeli:

Kod
id_obrazu | id_kategorii | id_glosującego
1 | 1 | 35
1 | 1 | 36
1 | 1 | 38
1 | 1 | 37
2 | 1 | 40
2 | 1 | 41
3 | 1 | 45
7 | 2 | 37
7 | 2 | 40
6 | 2 | 41


mój cel :

kategoria nr 1
zwyciężył obraz nr 1 (4 głosy)
drugie miejsce obraz nr 2 (2 głosy)
trzecie miejsce obraz nr 3 (1 głosy)

kategoria nr 2 - zwyciężył obraz nr 7 (2 głosy)
(...)
Greg0
użyj COUNT i GROUP BY id_obrazu
kleszczoscisk
tabela:
Kod
picture user category     date
6     55     5     2013-03-16 17:59:37
5     55     1     2013-03-16 18:30:01
1     53     1     2013-03-16 18:31:50
5     2     1     2013-03-16 18:33:05
5     3     1     2013-03-16 18:34:38
5     4     1     2013-03-16 18:34:38
2     53     2     2013-03-16 18:42:43
4     53     4     2013-03-16 18:42:59

zapytanie:
  1. SELECT picture,category,count(picture) AS ile FROM `votes2` GROUP BY category;

rezultat:
Kod
picture     category     ile
5     1     5
2     2     1
4     4     1
6     5     1


Na obrazek nr 5 zagłosowano 4 razy, w zapytaniu pokazuje mi ile jest rekordów w danej kategorii... co powinienem zmienić ? Nie rozumiem tego, robię jakiś bałagan...


edit:
  1. SELECT picture,category,count(picture) AS ile FROM `votes2` GROUP BY picture ORDER BY ile DESC

to zapytanie daje mi wszystkie obrazki na które głosowano, z kategorią i ilością głosów. Jak teraz wybrać z tego obrazek, który dostał największą ilość głosów w każdej kategorii ? ... lub 3 liderów ?

  1. SELECT picture,category,count(picture) AS ile FROM `votes2` WHERE category = 1 GROUP BY picture,category ORDER BY ile DESC LIMIT 1

to zapytanie daje mi lidera w wybranej kategorii. Czy jest możliwość aby pobrać 5 liderów w 5 kategoriach w jednym zapytaniu ?
_Borys_
  1. SELECT picture,category,count(picture) AS ile FROM `votes2` GROUP BY category,picture ORDER BY ile DESC LIMIT 5
kleszczoscisk
Cytat(_Borys_ @ 16.03.2013, 21:56:10 ) *
  1. SELECT picture,category,count(picture) AS ile FROM `votes2` GROUP BY category,picture ORDER BY ile DESC LIMIT 5

Nie działa. Tzn, działa ale nie tak jak trzeba. LIMIT 5 ale nie do kategorii tylko do obrazków - każdy obrazek z największą ilością głosów w swojej kategorii.
W sumie 5 obrazków, każdy w innej kategorii, każdy z największą ilością głosów w swojej kategorii.
Każdy obrazek ma przyporządkowaną kategorię na stałe.
Nie moze byc jeden i ten sam obrazek w kilku kategoriach.

Póki co zrobiłem zapytanie z "WHERE category = $x" w pętli foreach. Może tak być czy stracę hosting ?
mmmmmmm
  1. SELECT
  2. g.*
  3. FROM
  4. (
  5. SELECT
  6. id_kategorii,
  7. id_obrazu,
  8. count(*) ilosc
  9. FROM
  10. t
  11. GROUP BY 1,2
  12. ) g
  13. JOIN
  14. (
  15. SELECT
  16. id_kategorii,
  17. Max(ilosc) m
  18. FROM
  19. (
  20. SELECT
  21. id_kategorii,
  22. id_obrazu,
  23. count(*) ilosc
  24. FROM
  25. t
  26. GROUP BY 1,2
  27. ) x
  28. GROUP BY 1
  29. ) m
  30. ON g.id_kategorii=m.id_kategorii AND m.m=g.ilosc
kleszczoscisk
  1. SELECT g.* FROM (SELECT category, picture, count(*) glosy FROM votes2 GROUP BY 1,2) g JOIN (SELECT category, Max(glosy) m FROM (SELECT category, picture, count(*) glosy FROM votes2 GROUP BY 1,2 ) x GROUP BY 1 ) m ON g.category=m.category AND m.m=g.glosy


MIAZGA.
Dzięki!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.