升级新的SQL(无论如何这个代码)并且不知何故它似乎不想返回任何结果但没有SQL错误,所以我不知道我在哪里做错了什么.. < / p>
SELECT COUNT(`vote_counter`.`user_id`) 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`
ORDER BY count DESC
Account_date
表:puu.sh/tWrrZ/5121586f63.png
我猜这可能与我的SQL有关,但不是100%肯定。但是它应该返回计数,user_id然后从account_data中获取昵称并输出它。
因此,如果user_id 1的计数为5且昵称为“User 1”,则会输出以下内容:5,1,user 1
答案 0 :(得分:0)
SELECT COUNT(`vote_counter`.`user_id`) 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
答案 1 :(得分:0)
计数直接存储在表格中。为什么使用聚合函数Count(vote_counter.user_id)作为计数来获取
select vote_counter.count,vote_counter.user_id
from vote_counter
LEFT JOIN account_data a ON a.id=vote_counter.user_id
where vote_counter.date=2017-02
group by vote_counter.user_id order by count
答案 2 :(得分:0)
试试这个
SELECT COUNT(vote_counter.user_id) 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_i,
account_data.nickname
ORDER BY count DESC
答案 3 :(得分:0)
在我最终找到一些看起来不正确的东西后,最终的代码如下所示。谢谢你的帮助!
SELECT vote_counter.count 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
答案 4 :(得分:0)
您在答案中的查询将无效。至少在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&#39; vote_counter.count&#39;是 在选择列表中无效,因为它不包含在任何一个中 聚合函数或GROUP BY子句。
我们说没有错误,该查询的结果可能是(我已经添加了最后一栏来证明我的观点):
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
运行上述查询,该怎么办?你问:那个日期有什么特别之处?那个日期在第二行有一个Null
条目用于计数。那么使用null条目的数据库引擎是什么呢?如果你在SQL Server中写了这个:
select Null + 1000000;
结果将是NULL
,因为NULL
加上任何数字都是NULL
。因此,如果我们针对投票计数运行查询,它是否会为NULL
显示count
?不,它不会。它会显示这个结果:
count user_id nickname date
5 1 Kasc 2016-08
但你也会看到这条消息:
警告:聚合或其他SET消除了空值 操作
换句话说,具有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
是一个好名字,因为它听起来更像是计算的东西。一个更好的名称是vote_count
或更好:VoteCount
使用pascal表示法(尽管有些人可能不喜欢它)。
尽量不要使用date
和count
等保留关键字命名对象(表格,列,索引等)。因此date
可以是VoteDate
或VotingDate
,count
可以是VoteCount
或NumberOfVotes
。