执行检查是否存在值

时间:2011-08-01 18:23:30

标签: mysql performance

我对MySQL-Query有一点性能问题,并且不知道如何正确构建它,因此它可以尽可能少地工作。

问题:

想象一个包含两列的表:user(int),item(int)

用户有不同的相关项目。也许user-1有item-1,item-2,item-3和user-2有item-1,item-3,item-4。

我想知道的是,如果至少有一个其他用户也有这个项目,那么特定用户-X和每个项目是单独的。

我开始的是

SELECT item
FROM table
WHERE item IN (SELECT item FROM table WHERE user = X) AND user != X
GROUP BY item

...但这是低效的,因为在这种情况下,查询搜索整个表并检查每个项目,如果已​​经找到每个项目。 我不能限制查询,因为我不知道user-X实际上有多少项。 并且每个项目单独发送LIMTI 1的搜索查询也不是一个好主意。

对于抽象,你也可以说我想知道一组item-X,...,item-Y(不是订单或连续编号)是否与至少一个用户相关联。

我根本不关心物品的使用频率,只想知道是否至少一次。

那么,怎么做得对呢? 谢谢你的任何建议!

3 个答案:

答案 0 :(得分:1)

您正在寻找的是EXISTS条款。

如果提供的子查询中有任何匹配的行,它将评估为 true

SELECT item
FROM table AS t1
WHERE user = X
  AND EXISTS ( SELECT * FROM table AS t2 WHERE user <> X AND t1.item = t2.item )
GROUP BY item

答案 1 :(得分:0)

这是一个简单的HAVING,不是吗?

  

给我用户x和至少一个其他用户都有的项目

SELECT item
FROM table
GROUP BY item -- per item
HAVING 
  COUNT (DISTINCT UserID) > 1 -- more than one user for an item
  AND 
  COUNT(CASE WHEN userID = X THEN 1 ELSE NULL END) > 0 -- including user x

答案 2 :(得分:0)

SELECT DISTINCT t1.item
    FROM table t1
        INNER JOIN table t2
            ON t1.item = t2.item
                AND t1.user <> t2.user
    WHERE t1.user = X