我有sql表:
id user city
1 Alisa New York
2 Alisa Sydney
3 Alisa Rom
4 Alisa Toronto
5 Bob Rom
6 Bob Moskow
7 Bob Sydney
8 Tom Sydney
我需要知道有多少同样的城市有其他用户为鲍勃服务。
SELECT user, count(DISTINCT city) FROM table WHERE city IN (
SELECT city FROM table WHERE user = 'Bob'
) AND user != 'Bob' GROUP BY user
结果是:
user count(DISTINCT city)
Alisa 2
Tom 1
您知道提出此请求的其他最佳方式吗? 巨大的桌子可以吗?
答案 0 :(得分:1)
这个怎么样:
SELECT A.user,
count(DISTINCT A.city)
FROM table A,
(SELECT city FROM table WHERE user = 'Bob') B
WHERE A.city = B.city
AND A.user != 'Bob'
GROUP BY A.user
答案 1 :(得分:1)
您应输入一些数据,然后执行EXPLAIN
这是唯一能够以合理的准确度预测它是否正常的方法。
答案 2 :(得分:0)
CREATE TEMPORARY TABLE Cities (city varchar(100));
INSERT INTO Cities SELECT city FROM table WHERE user = 'Bob';
SELECT user, count(DISTINCT t.city)
FROM table AS t
INNER JOIN Cities AS c ON t.City=c.City
AND t.user !='Bob'
GROUP BY User
您可以创建一个临时表,您将在其中存储Bob所在的城市,然后在您的表与您创建的临时表之间进行内部联接。
答案 3 :(得分:0)
你可以通过自我加入或使用EXISTS
来做到这一点,这两者都远远优于尝试使用IN (SELECT ...)
,这绝不是一个好主意。这对于“大桌子”是否合适取决于你对“ok”和“huge table”的定义,以及你的架构,但这至少应该帮助你指明正确的方向。
这是EXISTS
版本:
SELECT user, count(DISTINCT city)
FROM table as main_query
WHERE user != 'Bob'
AND EXISTS (
SELECT NULL
FROM table as sub_query
WHERE sub_query.user = 'Bob'
and sub_query.city = main_query.city
)
GROUP BY user