什么是执行这个复杂的SELECT查询的简单方法?

时间:2014-01-23 11:27:52

标签: mysql sql performance

在表table中给出这些条目:

user    entry

A       1   
A       2   
A       5
A       6
B       1   
B       2   
B       3
B       4
B       5
B       6
C       1
C       4
D       1
D       2
D       5
D       6
D       7
D       9

我们有一个要使用的子集entries_A,即数组[1,2,5,6]

问题:

  1. 查找具有相同条目[1,2,5,6]及更多条目的所有用户,例如[1,2,5,6,7]或[1,2,3,5,6]。
  2. 查找具有大量相同条目(以及更多)的所有用户,例如[1,2,5,9]或[2,5,6,3]。
  3. 我能提出的第一个问题的最佳解决方案是以下选择查询:

    SELECT DISTINCT user AS u FROM table WHERE EXISTS (SELECT * FROM table WHERE entry=1 AND user=u)
                                        AND EXISTS(SELECT * FROM table WHERE entry=2 AND user=u)
                                        AND EXISTS(SELECT * FROM table WHERE entry=5 AND user=u)
                                        AND EXISTS(SELECT * FROM table WHERE entry=6 AND user=u)
    

    另一方面,我感觉有一些潜伏在表面下方的代数矢量问题(特别是对于问题二)但我似乎无法绕过它。

    欢迎所有想法!

3 个答案:

答案 0 :(得分:2)

我认为执行此类查询的最简单方法是使用聚合和having。这是一个例子。

要获得具有这四个元素的A:

select user
from table
group by user
having sum(entry in (1,2,5,6)) > 0 and
       count(distinct entry) = 4;

要获得具有这四个元素以及其他元素的A:

select user
from table
group by user
having sum(entry in (1,2,5,6)) > 0 and
       count(distinct entry) >= 4;

按照用户所拥有的匹配数和其他匹配数来订购用户:

select count(distinct case when entry in (1, 2, 5, 6) then entry end) as Matches,
       count(distinct case when entry not in (1, 2, 5, 6) then entry end) as Others,
       user
from table
group by user
order by Matches desc, Others;

答案 1 :(得分:1)

对于第一个问题:

SELECT user FROM (
    SELECT
    DISTINCT user
    FROM 
    table
    WHERE entry IN (1,2,5,6)
) a JOIN table b ON a.user = b.user
GROUP BY a.user
HAVING COUNT(*) >= 4

对于第二个问题,只需减少having子句中的计数。

答案 2 :(得分:1)

这就是我对你的第一个查询的看法(尽管我认为Gordon Linoff的答案更有效率):

select distinct user from so s1 
where not exists ( 
    select * from so s2 where s2.entry in (1,2,5,6) 
       and not exists ( 
          select * from so s3 where s2.entry = s3.entry and s1.user = s3.user
    )
);

对于第二个问题,您需要指定a lot应该是什么意思......三,四,......