Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Zliaczeni ilości rekordów bez powtórzeń
Zaszczyk
post 23.12.2012, 17:26:45
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.08.2007

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


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.
Go to the top of the page
+Quote Post
IceManSpy
post 23.12.2012, 18:44:12
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Użyj distinct, żeby nie powtarzało, a limit, aby wybrało X rekordów.


--------------------
Go to the top of the page
+Quote Post
Zaszczyk
post 23.12.2012, 19:48:08
Post #3





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.08.2007

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


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.
Go to the top of the page
+Quote Post
webdice
post 23.12.2012, 20:05:10
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Nie czytałem całego posta.

  1. SELECT DISTINCT N.profile_id,count(K.id)
Go to the top of the page
+Quote Post
Zaszczyk
post 23.12.2012, 20:49:30
Post #5





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.08.2007

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


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...
Go to the top of the page
+Quote Post
webdice
post 24.12.2012, 01:02:14
Post #6


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




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?
Go to the top of the page
+Quote Post
mmmmmmm
post 24.12.2012, 12:36:24
Post #7





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

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


Count(DISTINCT k.id)
Go to the top of the page
+Quote Post
Zaszczyk
post 25.12.2012, 20:23:00
Post #8





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.08.2007

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


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.
Go to the top of the page
+Quote Post
mmmmmmm
post 25.12.2012, 20:59:45
Post #9





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

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


  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 ...
Go to the top of the page
+Quote Post
mortus
post 25.12.2012, 21:03:38
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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
Go to the top of the page
+Quote Post
mmmmmmm
post 26.12.2012, 00:25:40
Post #11





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

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


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.
Go to the top of the page
+Quote Post
Zaszczyk
post 26.12.2012, 13:31:48
Post #12





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.08.2007

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


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!
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:39