Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Zliaczeni ilości rekordów bez powtórzeń
Forum PHP.pl > Forum > Bazy danych > MySQL
Zaszczyk
Muszę zliczyć ilość rekordów dla każdego profile_id, ale tak żeby nie liczyło powtarzających się author_id. I do tego żeby sortowało je malejąco i zapisało tylko 6 rekordów. Z pomocą googla stworzyłem takie zapytanie:

  1. SELECT N.profile_id,count(K.id) AS comments FROM profiles_comments N LEFT JOIN profiles_comments K ON K.profile_id=N.profile_id GROUP BY N.id ORDER BY comments DESC


Tabela: profiles comments
Kolumny:
-id - unikalny id każdego komentarza
-profile_id - id profilu do którego należy komentarz
-author_id - id autora komentarza

Tłumacząc jeszczę raz w innych słowach potrzebuję zapytania który pobierze dane do rankingu na najczęściej komentowany profil, ale tak żeby nie liczyło powtarzających się komentarzy tego samego autora.

W tej chwili to zapytanie zlicza ilość komentarzy, ale razem z powtarzającymi się author_id, a powinno je pomijać jak już zliczy jedno. Będę wdzięczny za pomoc.
IceManSpy
Użyj distinct, żeby nie powtarzało, a limit, aby wybrało X rekordów.
Zaszczyk
Tak... że używa się distinct w takim celu to wiem, próbowałem stworzyć zapytanie z tą regułą tylko nie mam pojęcia w ktorym miejscu ma być, a próbowałem z kilkunastoma kombinacjami.
webdice
Nie czytałem całego posta.

  1. SELECT DISTINCT N.profile_id,count(K.id)
Zaszczyk
Cytat(webdice @ 23.12.2012, 20:05:10 ) *
Nie czytałem całego posta.

  1. SELECT DISTINCT N.profile_id,count(K.id)

nie działa...
webdice
Cytat(Zaszczyk @ 23.12.2012, 17:26:45 ) *
Muszę zliczyć ilość rekordów dla każdego profile_id, ale tak żeby nie liczyło powtarzających się author_id. (...)


Skoro tak, to dlaczego grupujesz po id?
mmmmmmm
Count(DISTINCT k.id)
Zaszczyk
Próbowałem z obiema opcjami, w różnych konfiguracjach i dalej nie działa. Jeśli komuś byłoby to pomocne to dodaje zrzut bazy danych:

Tabela z komentarzami:
  1.  
  2. CREATE TABLE IF NOT EXISTS `profiles_comments` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `profile_id` mediumint(9) UNSIGNED NOT NULL,
  5. `author_id` mediumint(9) NOT NULL COMMENT 'id usera komentujacego',
  6. `date` int(11) NOT NULL,
  7. `tresc` text NOT NULL,
  8. `type` tinyint(1) NOT NULL DEFAULT '0',
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=45 ;
  11.  
  12. --
  13. -- Zrzut danych tabeli `profiles_comments`
  14. --
  15.  
  16. INSERT INTO `profiles_comments` (`id`, `profile_id`, `author_id`, `date`, `tresc`, `type`) VALUES
  17. (1, 13, 1, 1344094056, 'Lorem ipsum .', 0),
  18. (2, 13, 1, 1344094056, 'Lorem ipsum dolor sit ', 0),
  19. (3, 13, 1, 1344100516, '', 0),
  20. (4, 13, 1, 1344100686, '', 0),
  21. (5, 13, 1, 1344100712, '', 0),
  22. (6, 7, 1, 1344100721, '', 0),
  23. (7, 7, 1, 1344100743, 'sadfasdf', 0),
  24. (8, 7, 1, 1344100758, 'fdgsfdgdfs', 0),
  25. (9, 7, 1, 1344100763, 'fsdgsdfgsfdg', 0),
  26. (10, 7, 1, 1344100769, 'sdfgsdfggf', 0),
  27. (11, 7, 1, 1344101057, 'sad', 0),
  28. (12, 7, 1, 1344101068, 'dsafasdfdafs', 0),
  29. (13, 7, 1, 1344101073, 'sdafsfda', 0),
  30. (14, 7, 1, 1344112925, 'sadf', 0),
  31. (15, 13, 1, 1344191045, 'asdf', 0),
  32. (17, 7, 1, 1344198779, 'aa', 0),
  33. (18, 7, 1, 1344198782, 'aa', 0),
  34. (19, 7, 1, 1344370573, 'asdf', 0),
  35. (20, 7, 7, 1344370740, 'sdaf', 0),
  36. (21, 7, 7, 1344370746, 'test', 0),
  37. (22, 15, 1, 1344370781, 'asdf', -1),
  38. (23, 7, 7, 1344371171, 'a', 0),
  39. (24, 7, 7, 1344371198, 'adsf', 0),
  40. (25, 7, 7, 1344371307, 'dssda', 1),
  41. (26, 7, 7, 1344371336, 'sadf', 0),
  42. (27, 7, 7, 1344371358, 'asdf', 1),
  43. (28, 7, 1, 1344444708, '', 0),
  44. (29, 7, 1, 1344444721, '', 0),
  45. (30, 7, 1, 1344444730, 'sdf', 0),
  46. (32, 15, 1, 1347457489, 'Mam pytanko.', 0),
  47. (33, 7, 1, 1347466662, 'asdfasdf', 0),
  48. (34, 11, 1, 1347467863, 'sdaffasd', 0),
  49. (42, 7, 2, 1348938173, 'sadfasdfasdf', 1),
  50. (38, 7, 1, 1348082107, 'dzisz w \\"dane profilu\\" tam masz edy', 0),
  51. (43, 7, 1, 1350743136, 'Lorem ipsum dolor sit amet', 0);


Tabela z zapisanym rankingiem:
  1. CREATE TABLE IF NOT EXISTS `rank_profiles_com` (
  2. `profile_id` int(11) NOT NULL,
  3. `comments` int(11) NOT NULL,
  4. UNIQUE KEY `profile_id` (`profile_id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Tak wygląda skrypt i zapytanie:
  1. $rankq = mysql_query("SELECT N.profile_id,count(K.id) AS comments FROM profiles_comments N LEFT JOIN profiles_comments K ON K.profile_id=N.profile_id GROUP BY N.id ORDER BY comments DESC") or die(mysql_error());
  2. while($rankr = mysql_fetch_array($rankq)){
  3. $insert = mysql_query("INSERT INTO rank_profiles_com(profile_id,comments) VALUES('$rankr[0]','$rankr[1]')");
  4. }


W przypadku tych danych zapytanie powinno wypluwać taki ranking:
7-3
11-1
13-1
15-1

A wypluwa taki:
7-26
13-6
15-2
11-1

Kilkadziesiąt minut próbowałem skonstruować to zapytanie, w googlach również szukałem, ale niestety nie wychodzi mi. Także nie proszę o pomoc bo mi się nie chce tego zrobić, tylko po prostu nie umiem.
mmmmmmm
  1. SELECT N.profile_id,count(DISTINCT K.author_id) AS comments FROM profiles_comments N LEFT JOIN profiles_comments K ON K.profile_id=N.profile_id GROUP BY N.profile_id ORDER BY comments DESC

Poza tym nie musisz tego w pętli dodawać, ale zrobiv to od razu w SQL-u:
INSERT INTO ... SELECT ...
mortus
A po co to złączenie?
  1. INSERT INTO `rank_profiles_com` (`profile_id`, `comments`)
  2. SELECT `profile_id`, COUNT(DISTINCT `author_id`) `comments` FROM `profiles_comments` GROUP BY `profile_id` ORDER BY `comments` DESC LIMIT 6
mmmmmmm
Złączenie pawdopodobnie jest po to, żeby uwzględniało również userów, którzy w ogóle nie komentowali. Count(*)=0. Dlatego też również jest LEFT JOIN.
Ale to się mogę tylko domyślać - nie ja jestem autorem.
Zaszczyk
Cytat(mortus @ 25.12.2012, 21:03:38 ) *
A po co to złączenie?
  1. INSERT INTO `rank_profiles_com` (`profile_id`, `comments`)
  2. SELECT `profile_id`, COUNT(DISTINCT `author_id`) `comments` FROM `profiles_comments` GROUP BY `profile_id` ORDER BY `comments` DESC LIMIT 6


Działa idealnie, wielkie 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.