2017-02-10 129 views
1

新的SQL升级(无论如何),它似乎并不想返回任何结果,但没有SQL错误,所以我不知道我在做什么错在哪里或什么。SQL没有返回任何结果?

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 

enter image description here

我猜这可能是一些与我的SQL,但不是100%肯定。但它应该返回count,user_id然后从account_data中获取昵称并输出它。

所以,如果USER_ID 1已经计为5和绰号 “用户1”,将输出以下:5,1,用户1

+0

您的查询不正确。日期应该在单引号内,并且需要更改组。参见[这里](https://www.techonthenet.com/sql/group_by.php) – CodingYoshi

+0

它通过每月的基础上输出一个月电流票(计数),因为我们在二月目前是它在为2017-02 SQL应搜索与匹配月份的日期表中的值是目前英寸 – iiKasc

+1

你能为相同 –

回答

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 '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_idnickname之间做了一个组,但是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。因此,如果我们运行我们的投票计数查询,它会显示NULLcount?不,它不会。它会显示这样的结果:

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 

在上面我们说,如果countNULL,然后用零代替。


我不认为命名表vote_counter表和列命名约定

是因为它听起来更像是一些并不计算一个好名字。用帕斯卡表示法(虽然有些人可能不喜欢它)VoteCount:一个更好的名字是vote_count或者更好。

尝试不使用保留关键字(如datecount)来命名对象(表,列,索引等)。所以date可能是VoteDateVotingDatecount可能是VoteCountNumberOfVotes

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 
+0

嘿,感谢您的帖子,但它仍然不会返回任何结果。用更多信息更新了主文章。 – iiKasc

0

计数被直接存储在表中。为什么你正在使用聚合函数计数(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 
+0

这工作的程度,因为你可以在puu.sh/tWsac/c50d48646d.png看到,用户ID为2的计数值为5,但在puu.sh/tWscE/1af9fd90dd.png – iiKasc

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 
+0

返回它作为1本工作的程度,你可以在puu.sh/tWsac/c50d48646d.png看到该用户ID 2的计数值是5,但是返回它作为1 puu.sh/tWscE/1af9fd90dd.png – iiKasc

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 
+0

大概日期是vote_counter列? – Strawberry

+0

看到我的答案。您的查询有问题。 – CodingYoshi