2011-08-01 9 views
0

MySQL-Queryに少しのパフォーマンス上の問題があり、正しい構築方法がわからないため、できるだけ努力しても機能しません。値が存在するかどうかの実行チェック

問題:

2列のテーブルを想像:ユーザー(INT)、アイテム(INT)

ユーザーが関連付けられたさまざまなアイテムを持っています。おそらく、user-1はitem-1、item-2、item-3、user-2にはitem-1、item-3、item-4があります。

私が知りたいのは、少なくとも1人の他のユーザーがこのアイテムを持っている場合、特定のユーザーXと各アイテムが別々のものであることです。私が始めた何

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

だった...しかし、一つ一つがすでに発見された場合は、この場合のクエリはその後も各項目のテーブル全体をチェックを通じて捜しますので、これは非効率的でした。 ユーザーXが実際に持っているアイテムの数がわからないため、クエリを制限できません。 LIMTI 1の検索クエリを各項目ごとに個別に送信することも良い考えではありません。

抽象化のために、アイテムX、...、アイテムYのセット(順不同または連続的な番号付け)が少なくとも1人のユーザーに関連付けられているかどうかを知りたいと言うこともできます。

私は、アイテムがまったく周りにいる頻度を気にせず、少なくとも1回は知りたいだけです。

これはどのように正しく行うことができますか? ありがとうございました!

答えて

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

これは簡単ですね。

くれユーザ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 
関連する問題