Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie zliczające unikalne rekordy i wybierające dane z innej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
jurcio6
Witam.

Mam pewien problem - nie mogę sobie poradzić z zapytaniem, które by wybierało dane na takiej zasadzie:

tabela votes:
  1. --
  2. -- Struktura tabeli dla `votes`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `votes` (
  6. `vote_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  7. `survey_id` smallint(5) UNSIGNED NOT NULL,
  8. `question_id` int(10) UNSIGNED NOT NULL,
  9. `answer` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  10. `IP` varchar(128) COLLATE utf8_polish_ci NOT NULL,
  11. `vote_time` datetime NOT NULL,
  12. PRIMARY KEY (`vote_id`),
  13. KEY `survey_id` (`survey_id`,`question_id`),
  14. KEY `question_id` (`question_id`)
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=77 ;
  16.  
  17. --
  18. -- Zrzut danych tabeli `votes`
  19. --
  20.  
  21. INSERT INTO `votes` (`vote_id`, `survey_id`, `question_id`, `answer`, `IP`, `vote_time`) VALUES
  22. (56, 44, 92, '3', '127.0.0.1', '2011-02-19 13:34:50'),
  23. (57, 44, 93, '3', '127.0.0.1', '2011-02-19 13:34:50'),
  24. (58, 44, 94, '6', '127.0.0.1', '2011-02-19 13:34:50'),
  25. (59, 44, 95, '2', '127.0.0.1', '2011-02-19 13:34:50'),
  26. (60, 44, 96, '9', '127.0.0.1', '2011-02-19 13:34:50'),
  27. (61, 44, 92, '3', '127.0.0.1', '2011-02-19 13:34:55'),
  28. (62, 44, 93, '3', '127.0.0.1', '2011-02-19 13:34:55'),
  29. (63, 44, 94, '6', '127.0.0.1', '2011-02-19 13:34:55'),
  30. (64, 44, 95, '2', '127.0.0.1', '2011-02-19 13:34:55'),
  31. (65, 44, 96, '9', '127.0.0.1', '2011-02-19 13:34:55'),
  32. (66, 44, 92, '3', '127.0.0.1', '2011-02-19 13:38:14'),
  33. (67, 44, 93, '3', '127.0.0.1', '2011-02-19 13:38:14'),
  34. (68, 44, 94, '6', '127.0.0.1', '2011-02-19 13:38:14'),
  35. (69, 44, 95, '2', '127.0.0.1', '2011-02-19 13:38:14'),
  36. (70, 44, 96, '9', '127.0.0.1', '2011-02-19 13:38:14'),
  37. (71, 44, 92, '1', '127.0.0.1', '2011-02-20 11:24:04'),
  38. (72, 44, 93, '3', '127.0.0.1', '2011-02-20 11:24:04'),
  39. (73, 44, 94, '3,4,5,6', '127.0.0.1', '2011-02-20 11:24:04'),
  40. (74, 44, 95, '2', '127.0.0.1', '2011-02-20 11:24:04'),
  41. (75, 44, 96, '5', '127.0.0.1', '2011-02-20 11:24:04'),
  42. (76, 43, 91, '1,3', '127.0.0.1', '2011-02-20 11:37:06');
  43.  
  44. --
  45. -- Ograniczenia dla zrzutów tabel
  46. --
  47.  
  48. --
  49. -- Ograniczenia dla tabeli `votes`
  50. --
  51. ALTER TABLE `votes`
  52. ADD CONSTRAINT `votes_ibfk_1` FOREIGN KEY (`survey_id`) REFERENCES `surveys` (`survey_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  53. ADD CONSTRAINT `votes_ibfk_2` FOREIGN KEY (`question_id`) REFERENCES `questions` (`question_id`) ON DELETE CASCADE ON UPDATE CASCADE;


tabela surveys:
  1. --
  2. -- Struktura tabeli dla `surveys`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `surveys` (
  6. `survey_id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  7. `survey_title` varchar(250) COLLATE utf8_polish_ci NOT NULL,
  8. `survey_desc` text COLLATE utf8_polish_ci,
  9. `user_id` tinyint(3) UNSIGNED NOT NULL COMMENT 'id uzytkownika, ktory dodal ankiete',
  10. `add_date` datetime NOT NULL,
  11. `mod_date` datetime DEFAULT NULL,
  12. `exp_date` datetime DEFAULT NULL,
  13. `visible` tinyint(1) NOT NULL,
  14. PRIMARY KEY (`survey_id`),
  15. KEY `id_autora` (`user_id`),
  16. KEY `data_dodania` (`add_date`),
  17. KEY `survey_id` (`survey_id`),
  18. KEY `survey_id_2` (`survey_id`)
  19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=45 ;
  20.  
  21. --
  22. -- Zrzut danych tabeli `surveys`
  23. --
  24.  
  25. INSERT INTO `surveys` (`survey_id`, `survey_title`, `survey_desc`, `user_id`, `add_date`, `mod_date`, `exp_date`, `visible`) VALUES
  26. (43, 'Jaką porę roku lubisz najbardziej?', 'Badanie dotyczące ulubionej pory roku ankietowanych.', 1, '2011-02-12 13:21:08', '2011-02-12 13:21:08', '2011-02-28 20:00:00', 1),
  27. (44, 'Ulubione kolory.', 'Kilka pytań odnośnie ulubionych kolorów.', 1, '2011-02-12 14:32:20', '2011-02-12 14:32:20', '2011-02-25 12:00:00', 1);
  28.  
  29. --
  30. -- Ograniczenia dla zrzutów tabel
  31. --


Pożądany wynik:
Chcę uzyskać tabelę, która będzie zawierać 2 kolumny:
- tytuły wszystkich ankiet (survey_title)
- zliczoną ilość unikalnych głosów na daną ankietę (unikalnych = takich, które mają jednakowy votes.vote_time)

Dla SQL'a powyżej tabela taka powinna wyglądać tak:
survey_title | votes
Ulubione kolor. | 4
Jaką porę roku.. | 1

Próbowałem na różne sposoby, ale jedyne, co mi się udało osiągnąć, to jest rekord, który zliczał te powtórzenia dobrze, no ale właśnie był to tylko jeden rekord, a ja chcę uzyskać wszystkie rekordy i county dla każdego tytułu ankiety.

Czy może mi ktoś pomóc? Będę bardzo wdzięczny.
trafas
Witam,

Zapytanie poniżej:

  1. SELECT s.survey_title,count(*)
  2. FROM votes v
  3. JOIN surveys s ON s.survey_id = v.survey_id
  4. GROUP BY vote_time
jurcio6
Prawie. Tzn. wszystko ok, za wyjątkiem tego, że wpisy się powtarzają:

survey_title count(*)
Ulubione kolory. 5
Ulubione kolory. 5
Ulubione kolory. 5
Ulubione kolory. 5
Jaką porę roku lubisz najbardziej? 1

Jak to zmodyfikować, aby się nie powtarzały?

Chciałbym jeszcze móc zastosować na końcu limit - w tym zapytaniu działa ok.
trafas
Zapytanie działa tak jak chciałeś:

"
Pożądany wynik:
Chcę uzyskać tabelę, która będzie zawierać 2 kolumny:
- tytuły wszystkich ankiet (survey_title)
- zliczoną ilość unikalnych głosów na daną ankietę (unikalnych = takich, które mają jednakowy votes.vote_time)
"

Zapytanie to grupuje głosy na daną ankietę po "votes.vote_time".

W przypadku podanych danych wejściowych, występują różne głosowania na tą samą ankietę ( o różnym votes.vote_time ).

Chyba że chcesz żeby zbierało wszystkie głosowania na dana ankietę, niezależnie od votes.vote_time ( czyli suma wszystkich głosowań na daną ankietę ), wtedy zapytanie by wyglądało tak:

  1. SELECT s.survey_title,count(*)
  2. FROM votes v
  3. JOIN surveys s ON s.survey_id = v.survey_id
  4. GROUP BY s.survey_title


LIMIT by ci tutaj tematu nie załatwił, bo obciąłbyś tylko niektóre wyniki głosowania.
jurcio6
Tak, ale wynik wcześniejszego zapytania jest taki:

survey_title count(*)
Ulubione kolory. 5
Ulubione kolory. 5
Ulubione kolory. 5
Ulubione kolory. 5
Jaką porę roku lubisz najbardziej? 1


Powtarzają się ankiety. Czy da się coś z tym zrobić? Żeby wynik wyglądał tak:

survey_title count(*)
Ulubione kolory. 5
Jaką porę roku lubisz najbardziej? 1

//różni się tym, że nie powtarzają się ankiety po title

może ktoś pomóc? naprawdę pilne!

Wreszcie udało mi się dojść jakoś do tego... rozwiązanie:

  1. SELECT s.survey_title, s.survey_id, count(DISTINCT(v.vote_time)) AS votes FROM votes v JOIN surveys s ON s.survey_id = v.survey_id GROUP BY s.survey_id ORDER BY votes DESC
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.