您在答案中的查询不起作用。至少在SQL Server中它不会工作并产生错误。我的假设是在MySQL中,它会返回结果,但如果发现重复项,结果将不准确:您的数据中现在没有这种情况,但这并不意味着您永远不会拥有它。继续阅读,你会明白为什么。
我在评论中询问你应该阅读关于Group By
的教程,以便真正理解正在发生的事情。没有必要调整查询并等待结果显示出来,然后得出结论:您已经达到了所需:您需要确保结果是正确的!更重要的是,你应该知道你的查询在做什么。
考虑这个vote_counter
表(我们会回来以后命名):
user_id count date
1 5 2016-08
1 NULL 2016-08
1 5 2017-02
2 5 2017-02
1 15 2017-02 <-- See this: user_id 1 has another entry for 2017-02
您所查询的是这样的(我省略为简洁起见某些部分):
SELECT vote_counter.count AS count,
vote_counter.user_id,
account_data.nickname
FROM ...
WHERE date = '2017-02'
GROUP BY vote_counter.user_id,
account_data.nickname
会导致在此错误中:
Msg 8120, Level 16, State 1, Line 1 Column 'vote_counter.count' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
假设有wa S无差错,该查询的结果可能是(我已经添加的最后一列,以证明我的观点):
count user_id nickname date
5 1 Kasc 2017-02
15 1 Kasc 2017-02
5 2 Alzar 2017-02
那么,什么是现在该怎么办SQL服务器?你在user_id
和nickname
之间做了一个组,但是user_id
的值为1显示了两次,所以它应该在结果中显示5还是15?我不确定MySQL在这种情况下会做什么。也许它会显示总数或可能会显示一个记录,我不知道。但是,混淆在那里,所以最好是明确的,并指出你想要的。
几乎正确的查询
所以要得到正确的结果,您需要申请一个聚集功能指示SQL Server总结count
列。这应该是查询(但这个查询还不够好,越到后来这个):
SELECT
SUM(vote_counter.count) AS [count], -- see the SUM aggregate
vote_counter.user_id,
account_data.nickname
FROM
vote_counter LEFT JOIN account_data ON account_data.id = vote_counter.user_id
WHERE
date = '2017-02'
GROUP BY
vote_counter.user_id,
account_data.nickname
ORDER BY
count DESC
现在的结果将是:
count user_id nickname date
20 1 Kasc 2017-02
5 2 Alzar 2017-02
好,看起来更好。
如何在集合函数中处理NULL值?
但是如果您运行日期2016-08
的上述查询呢?你问:那天有什么特别的?那么这个日期在count的第二行有一个Null
条目。那么,数据库引擎将如何处理空条目。如果你写了这个在SQL Server:
select Null + 1000000;
其结果将是NULL
因为NULL
外加任意数量是NULL
。因此,如果我们运行我们的投票计数查询,它会显示NULL
为count
?不,它不会。它会显示这样的结果:
count user_id nickname date
5 1 Kasc 2016-08
但你也将看到此消息:
Warning: Null value is eliminated by an aggregate or other SET operation.
所以换句话说,Null
值的行完全消除,而不是由总考虑。现在你问:那么问题是什么?那么,如果您正在执行另一个集合操作,例如Avg
,您的结果将会关闭并且完全不正确。有关更多详细信息,请阅读this文章。因此,您应该处理Null
值。
正确的查询
这里是最后的和正确的查询(注意isnull
):
select
Sum(Isnull(vote_counter.count, 0)) as [count]
,vote_counter.user_id
,account_data.nickname
from
vote_counter
left join account_data
on account_data.id = vote_counter.user_id
where
date = '2017-02'
group by vote_counter.user_id
,account_data.nickname
order by count desc
在上面我们说,如果count
有NULL
,然后用零代替。
我不认为命名表vote_counter
表和列命名约定
是因为它听起来更像是一些并不计算一个好名字。用帕斯卡表示法(虽然有些人可能不喜欢它)VoteCount
:一个更好的名字是vote_count
或者更好。
尝试不使用保留关键字(如date
和count
)来命名对象(表,列,索引等)。所以date
可能是VoteDate
或VotingDate
和count
可能是VoteCount
或NumberOfVotes
。
您的查询不正确。日期应该在单引号内,并且需要更改组。参见[这里](https://www.techonthenet.com/sql/group_by.php) – CodingYoshi
它通过每月的基础上输出一个月电流票(计数),因为我们在二月目前是它在为2017-02 SQL应搜索与匹配月份的日期表中的值是目前英寸 – iiKasc
你能为相同 –