我对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(不是订单或连续编号)是否与至少一个用户相关联。
我根本不关心物品的使用频率,只想知道是否至少一次。
那么,怎么做得对呢? 谢谢你的任何建议!
答案 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