[英]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
Account_date
表: puu.sh/tWrrZ/5121586f63.png 我猜這可能與我的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_id
和nickname
了一個組,但是值為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
在上面我們說如果count
為NULL
,則使用零代替。
表和列命名約定
我不認為命名一個表vote_counter
是一個好名字,因為它聽起來更像是計算的東西。 一個更好的名字是vote_count
或更好: VoteCount
使用pascal表示法(雖然有些人可能不喜歡它)。
盡量不要使用date
和count
等保留關鍵字來命名對象(表,列,索引等)。 所以date
可以是VoteDate
或VotingDate
, count
可以是VoteCount
或NumberOfVotes
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.