0

テーブル「argument_user」

+-------------+----------+
| argument    | user_id  |
+-------------+----------+
| bike        | 1        |
| flower      | 2        |
| web         | 1        |
| web         | 2        |
| nature      | 1        |
| nature      | 2        |
| nature      | 3        |
+-------------+----------+

ユーザー1と2に共通する引数のみを取得したい>>「web」(「nature」なし)

+-------------+
| web         |
+-------------+

現在、このクエリを使用していますが、「web」と「house」が返されるため、間違っています。

select argument from argument_user 
where user_id in ('1','2') 
group by argument having count(distinct(user_id)) = 2

+-------------+
| web         |
| nature      |
+-------------+

同じテーブルで結合しようと思ったのですが、ユーザーが増えると重すぎると思います!そうでしょう?したがって、多くの「user_id」で使用するための軽いものです。

4

4 に答える 4

1

いくつかのJOINを使用する

SELECT *
FROM argument_user a
INNER JOIN argument_user b
ON a.argument = b.argument
LEFT OUTER JOIN argument_user c
ON a.argument = c.argument
AND c.user_id NOT IN (1,2)
WHERE a.user_id = 1
AND b.user_id = 2
AND c.user_id IS NULL
于 2012-10-15T15:59:41.110 に答える
0

user_idにインデックスが付けられているとすると、WHERE句のINにより、テーブルに追加するユーザーの数に関係なく、このクエリが高速になります。

私はテーブルの結合をそれ自体に戻すのではなく、離れているのを使用します。ここでも、WHEREのIN句により、結合によって処理される実際の評価セットがかなり小さくなります(inステートメントに数百人のユーザーが含まれていないと仮定します)。

また、user_idが整数の場合は、IN句でそれらをqouteしないでください。これは不要な型変換です。

于 2012-10-15T15:46:44.920 に答える
0

これを試して:

select argument,count(*) from table1
where user_id in ('1','2') 
and argument not in(select argument from table1 group by argument having count(*) <> 2)
group by argument
having count(*)=2

SQL FIDDLE DEMO

于 2012-10-15T16:29:29.223 に答える
0

このSQLクエリはうまく機能します

select * 
from (
(
    select argument
        ,GROUP_CONCAT(user_id order by user_id) as user_id
    from argument_user
    group by argument
    ) as TEMP
)
group by argument
having user_id = '1,2';
于 2014-07-17T08:21:34.257 に答える