2011-05-11 92 views
0

我正在處理一個查詢,該查詢正在連接多個表以進行深入分析,以獲取訂閱者投票次數超過一個區域的訂閱者數量。MySQL選擇行大於1的行

我被困在的問題是試圖在查詢中計算訂閱者投票超過一個的計算。

SELECT COUNT(*), regions.name, 
(SELECT COUNT(*) FROM votes 
LEFT JOIN profiles on votes.subscriber_id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
WHERE countries.region_id = regions.id GROUP BY votes.subscriber_id) as vote_count 
FROM subscribers 
LEFT JOIN profiles on subscribers.id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
LEFT JOIN regions on countries.region_id = regions.id 
LEFT JOIN votes on subscribers.id = votes.subscriber_id 
WHERE subscribers.created_at < '2011-04-22 00:00:00' 
GROUP BY regions.id 
HAVING vote_count > 1; 

隨着我得到的錯誤上面的查詢,Subquery returns more than 1 row

任何想法?

+0

你能更清楚地解釋你要找的是什麼號碼嗎?如果子查詢不能保證返回單個行,這將始終給出錯誤,因爲它期望子查詢中的字段名稱。 – Mel 2011-05-11 20:16:54

回答

0

,如果你的子查詢:

(SELECT COUNT(*) FROM votes 
LEFT JOIN profiles on votes.subscriber_id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
WHERE countries.region_id = regions.id GROUP BY votes.subscriber_id) 

返回超過1行,那麼就會報錯,因爲它試圖把行的集合到值vote_count。您可以通過添加HAVING子句來保證查詢只有1行結果。

0

由於您將子查詢放置在查詢的SELECT部分​​中,因此只有一個返回值(因爲結果集是二維的)。

您必須在內部查詢的WHERE子句中添加與外部查詢匹配的某處,以確保只有一行匹配。

你要找的COUNT(*)是否與regions.name匹配?你必須連接內部查詢。

+0

謝謝Flupps - 我爲這個查詢提供的標準是根據地區查找具有多個投票的訂戶數量。從上面的查詢中可以看出,我在SQL中並不是非常強大,但我正在學習:D – dennismonsewicz 2011-05-11 20:19:07

1

的部分

SELECT COUNT(*) FROM votes 
LEFT JOIN profiles on votes.subscriber_id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
WHERE countries.region_id = regions.id GROUP BY votes.subscriber_id 

在返回多於一個的結果。嘗試刪除應解決問題的「GROUP BY votes.subscriber_id」

0

嘗試將HAVING vote_count > 1子句放入子查詢中。另外,請嘗試自己的子查詢來查看它的成果。