我有以下方案:
CREATE TABLE IF NOT EXISTS `answers` (
`id` bigint(20) unsigned NOT NULL,
`answer` varchar(200) NOT NULL,
`username` varchar(15) NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`,`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `answers` (`id`, `answer`, `username`, `date`) VALUES
(1, 'gfdsf', 'guy', '2012-12-22 00:00:00'),
(4, 'gfdddsfs', 'maricela', '2012-12-22 00:00:00'),
(4, 'gfddsfs', 'mikha', '2012-12-22 00:00:00'),
(4, 'gfdsfs', 'guy', '2012-12-22 00:00:00');
CREATE TABLE IF NOT EXISTS `questions` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`asker_username` varchar(15) NOT NULL,
`target_username` varchar(15) NOT NULL,
`question` varchar(200) NOT NULL,
`hide` enum('y','n') NOT NULL DEFAULT 'n',
`date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
INSERT INTO `questions` (`id`, `asker_username`, `target_username`, `question`, `date`) VALUES
(1, 'mikha', 'guy', 'testo festo', '2012-12-22 00:00:00'),
(2, 'mikha', 'guy', 'saaaaaaaar', '2012-12-22 00:00:00'),
(3, 'sys.tem', 'every.one', 'test g1', '2012-12-06 00:00:00'),
(4, 'sys.tem', 'every.one', 'test g2', '2012-12-06 00:00:00');
我使用以下查询:
SELECT
questions.id AS questionid,
COUNT(answers.username) AS count_everyone,
answers.username
FROM questions
LEFT JOIN answers ON questions.id = answers.id
GROUP BY questions.id,answers.username
问题在于COUNT(answers.username
。我想计算每个问题的答案,但查询显示计数为1.例如问题ID 4被回答3次,但COUNT(answers.username)
将其显示为1而不是3。
这是预期的结果:
questionid count_everyone username
1 1 guy
2 0 null
3 0 null
4 3 guy
4 3 maricela
4 3 mikha
这是我实际获得的结果:
questionid count_everyone username
1 1 guy
2 0 null
3 0 null
4 1 guy
4 1 maricela
4 1 mikha
由于
答案 0 :(得分:4)
select q.id, coalesce(j.AnswerCount, 0) as AnswerCount, a.username
from questions q
left outer join
(select id as Qid, count(answer) as AnswerCount
from answers
group by id) j
on q.id = j.Qid
left outer join
answers a on q.id = a.id
答案 1 :(得分:2)
要获得正确的计数,您应该只按问题ID分组,而不是用户名:
SELECT
questions.id AS questionid,
COUNT(answers.username) AS count_everyone
FROM questions
LEFT JOIN answers ON questions.id = answers.id
GROUP BY questions.id
如果您拥有来获取同一查询中的用户名,请使用联接:
SELECT questionid, count_everyone, username
FROM
(
SELECT
questions.id AS questionid,
COUNT(answers.username) AS count_everyone
FROM questions
LEFT JOIN answers ON questions.id = answers.id
GROUP BY questions.id
) T1
LEFT JOIN answers ON T1.questionid = answers.id
或GROUP_CONCAT
:
SELECT
questions.id AS questionid,
COUNT(answers.username) AS count_everyone,
GROUP_CONCAT(answers.username) AS usernames
FROM questions
LEFT JOIN answers ON questions.id = answers.id
GROUP BY questions.id
或相关子查询:
SELECT
questions.id AS questionid,
(SELECT COUNT(*) FROM answers WHERE questions.id = answers.id) AS count_everyone,
answers.username
FROM questions
LEFT JOIN answers ON questions.id = answers.id
答案 2 :(得分:1)
答案 3 :(得分:1)
这个怎么样:
SELECT
questions.id AS questionid,
COUNT(answers.username) AS count_everyone,
GROUP_CONCAT(answers.username) users
FROM questions
LEFT JOIN answers ON questions.id = answers.id
WHERE questions.target_username = 'every.one'
GROUP BY questions.id
答案 4 :(得分:0)
据我所知,你应该改变这个:
COUNT(answers.username) AS count_everyone,
为:
COUNT(answers.id) AS count_everyone,
因为你实际上想要计算具有相同ID的答案数...