SQL没有返回任何结果?

时间:2017-02-10 06:26:03

标签: mysql sql

升级新的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

enter image description here

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

因此,如果user_id 1的计数为5且昵称为“User 1”,则会输出以下内容:5,1,user 1

5 个答案:

答案 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_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运行上述查询,该怎么办?你问:那个日期有什么特别之处?那个日期在第二行有一个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表示法(尽管有些人可能不喜欢它)。

尽量不要使用datecount等保留关键字命名对象(表格,列,索引等)。因此date可以是VoteDateVotingDatecount可以是VoteCountNumberOfVotes

相关问题