MySQL查询:获取此查询的不同值

MySQL查询:获取此查询的不同值,mysql,Mysql,我想获取所有项目id为100、项目id为200的不同用户id。在这种情况下,正确的结果是1。但在这种简化的情况下,我的SQL查询会是什么样子呢? 表: user_id item_id 1 100 1 200 3 100 使用条件聚合: SELECT user_id FROM yourTable WHERE item_id IN (100, 200) GROUP BY user_id HAVING COUNT(DISTINCT item

我想获取所有项目id为100、项目id为200的不同用户id。在这种情况下,正确的结果是1。但在这种简化的情况下,我的SQL查询会是什么样子呢? 表:

user_id    item_id
1          100
1          200
3          100

使用条件聚合:

SELECT user_id
FROM yourTable
WHERE item_id IN (100, 200)
GROUP BY user_id
HAVING COUNT(DISTINCT item_id) = 2;
此技巧首先将记录限制为仅与您感兴趣的两个项目对应,然后断言匹配的用户具有两个不同的项目计数,这意味着他满足条件

有时,逻辑要求以稍微不同的方式执行此操作:

SELECT user_id
FROM yourTable
GROUP BY user_id
HAVING
    SUM(CASE WHEN item_id = 100 THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN item_id = 200 THEN 1 ELSE 0 END) > 0;

此表单在某些情况下可能更有用,但其作用相同。

使用条件聚合:

SELECT user_id
FROM yourTable
WHERE item_id IN (100, 200)
GROUP BY user_id
HAVING COUNT(DISTINCT item_id) = 2;
此技巧首先将记录限制为仅与您感兴趣的两个项目对应,然后断言匹配的用户具有两个不同的项目计数,这意味着他满足条件

有时,逻辑要求以稍微不同的方式执行此操作:

SELECT user_id
FROM yourTable
GROUP BY user_id
HAVING
    SUM(CASE WHEN item_id = 100 THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN item_id = 200 THEN 1 ELSE 0 END) > 0;
在某些情况下,此表单可能更有用,但它的作用相同。

您可以使用自连接(直观上更容易理解):

您可以使用自联接(直观上更容易理解):


非常感谢你!这正是我需要的。同样感谢P.Salmon提供相同的解决方案!非常感谢你!这正是我需要的。同样感谢P.Salmon提供相同的解决方案!回答得好。请注意,
DISTINCT
还需要一个聚合步骤。啊,好的!非常感谢。所以,另一种解决方案会有轻微的性能优势?很难说,这取决于您拥有的索引,甚至可能取决于表中的数据。回答得好。请注意,
DISTINCT
还需要一个聚合步骤。啊,好的!非常感谢。因此,另一种解决方案会有轻微的性能优势?很难说,这取决于您拥有的索引,甚至可能取决于表中的数据。