如何在SQL中搜索并获取巨大的表(where-in)

时间:2013-12-05 15:11:02

标签: mysql sql group-by where-in

我有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

您知道提出此请求的其他最佳方式吗? 巨大的桌子可以吗?

4 个答案:

答案 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