MySQL:检索ID,其中恰好2行共享相同的ID但具有不同的用户ID

时间:2018-11-02 19:28:30

标签: mysql

我有一个MySQL表,该表将用户与类似于以下图像或sqlfiddle的对话相关联:

MySQL Table Screenshot

http://sqlfiddle.com/#!9/b4d329

如您所见,用户1000001和用户1000002都属于2个会话-10和20。

我需要做的是检索仅用户1000001和用户1000002与之关联的session_id。将被拉出的正确的session_id是10。

正如您在session_id 20中看到的那样,第三个用户与之相关联-1000003-因此,即使用户1000001和1000002与之相关联,我也不想拉出该session_id。

还请注意,只有一个user_id与一个session_id相关联时,这种情况就不会发生。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

这是一种高效的方法,根本不使用子查询。您可以使用条件聚合在Having子句中过滤出结果:

SELECT 
  conversation_id 
FROM assoc_user__conversation 
GROUP BY conversation_id 
HAVING 
  -- all the rows to exists only for 1000001 or 1000002 only
  SUM(user_id IN (1000001, 1000002)) = COUNT(*) 

结果

| conversation_id |
| --------------- |
| 10              |

View on DB Fiddle


条件聚合的另一种可能的变化是:

SELECT 
  conversation_id 
FROM assoc_user__conversation 
GROUP BY conversation_id 
HAVING 
  -- atleast one row for 1000001 to exists
  SUM(user_id = 1000001) AND  
  -- atleast one row for 1000002 to exists
  SUM(user_id = 1000002) AND  
  -- no row to exist for other user_id values
  NOT SUM(user_id NOT IN (1000001, 1000002)) 

答案 1 :(得分:1)

如果我们假设每个对话至少有2个参与者,则可以删除其他人在那里的所有对话,而让我们留下只有这2个用户在场的对话。

注意:我们需要上述假设,因为在某些情况下,1000001是唯一的参与者,我们不想显示这些对话。

select conversation_id
from table
where conversation_id not in (
    select conversation_id 
    from table 
    where user_id not in (1000001, 1000002))

编辑:

如果只有一个user_id与一个session_id相关联,我们也可以删除这些会话。

select conversation_id
from table
where conversation_id not in (
    select conversation_id 
    from table 
    where user_id not in (1000001, 1000002))
group by conversation_id
having count(*) = 2

假设相同的user_id不会在相同的对话中出现两次。

答案 2 :(得分:0)

我还没有测试过这段代码,但是我很确定它在逻辑上是合理的。您没有说表的名字,所以我只称它为表。

myprop