2011-08-01 21 views
0

我有一個MySQL的查詢性能問題,不知道如何建立它的權利,所以它儘可能少的工作。性能檢查值的存在

問題:

想象一個表有兩列:用戶(INT),項(INT)

在使用者有關聯的不同項。也許用戶1具有項目1,項目2,項目3和用戶2具有項目1,項目3,項目4。

我想知道的是,如果至少有一個其他用戶也有這些項目,則需要知道某個特定用戶-X和每個項目。

我開始與什麼是

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

...但因爲在這種情況下,通過查詢整個表,並檢查每個項目searchs即使這樣,如果每一個已經找到,這是低效的。 我不能限制查詢,因爲我不知道user-X實際上有多少個項目。 並且單獨爲每個項目發送LIMTI 1的搜索查詢也不是一個好主意。

對於抽象,你也可以說我想知道一組item-X,...,item-Y(不是順序或連續編號)是否與至少一個用戶相關聯。

我不在乎物品多久出現一次,只想知道是否至少有一次。

那麼,怎樣才能做到這一點? 感謝您的任何建議!

回答

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