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

这个 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 回答
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 小提琴演示

于 2012-10-15T16:29:29.223 回答
0

假设 user_id 已编入索引,无论您向表中添加多少用户,WHERE 子句中的 IN 都会使此查询快速进行。

我会使用表的连接本身而不是具有 disticnt。WHERE 中的 IN 子句再次使连接处理的实际评估集非常小(假设您的 in 语句中没有数百个用户!)

此外,如果 user_id 是整数,请不要在 IN 子句中引用它们——这是不必要的类型转换。

于 2012-10-15T15:46:44.920 回答