0

我正在处理一个查询,该查询将连接多个表以深入了解按订阅者拥有多于一票的地区投票的订阅者数量。

我遇到的问题是试图在查询中写出计算订阅者投票超过一个的位置。

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

有任何想法吗?

4

4 回答 4

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”

于 2011-05-11T20:17:17.847 回答
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 行,然后它会出错,因为它试图将一组行放入 valuevote_count中。您可以通过添加HAVING子句保证查询只有 1 行结果来解决此问题。

于 2011-05-11T20:16:47.483 回答
0

由于您将子查询放在查询的 SELECT 部分,因此只需要一个返回值(因为结果集是二维的)。

您必须在内部查询的 WHERE 子句中的某处添加与外部查询的匹配项,以确保只有一行匹配。

您要查找与 region.name 匹配的 COUNT(*) 是什么?您必须将内部查询连接到该查询。

于 2011-05-11T20:17:01.400 回答
0

尝试将HAVING vote_count > 1子句放在子查询中。此外,请自行尝试子查询以查看其产生的结果。

于 2011-05-11T20:17:48.143 回答