簡體   English   中英

SQL沒有返回任何結果?

[英]SQL not returning any results?

升技術新的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

在此輸入圖像描述

我猜這可能與我的SQL有關,但不是100%肯定。 但是它應該返回計數,user_id然后從account_data中獲取昵稱並輸出它。

因此,如果user_id 1的計數為5且昵稱為“User 1”,則輸出以下內容:5,1,user 1

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

Count直接存儲在表中。 為什么使用聚合函數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

試試這一個

 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

在我最終找到一些看起來不正確的東西后,最終的代碼如下所示。 謝謝您的幫助!

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

您在答案中的查詢將無效。 至少在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

會導致此錯誤:

消息8120,級別16,狀態1,行1列“vote_counter.count”在選擇列表中無效,因為它不包含在聚合函數或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了一個組,但是值為1的user_id顯示了兩次,所以它應該在結果中顯示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日期運行上述查詢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 ,您的結果將會關閉並且完全不正確。 閱讀文章的更多細節。 因此,您應該處理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是一個好名字,因為它聽起來更像是計算的東西。 一個更好的名字是vote_count或更好: VoteCount使用pascal表示法(雖然有些人可能不喜歡它)。

盡量不要使用datecount等保留關鍵字來命名對象(表,列,索引等)。 所以date可以是VoteDateVotingDatecount可以是VoteCountNumberOfVotes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM