MySQL:检索与其关联的 x 个 user_ids 的 ID

标签 mysql

提前非常感谢您的帮助。

我有一个类似于以下 DB Fiddle 的 MySQL 表:

https://www.db-fiddle.com/f/xa2Dt9cAPhiMfHcEv8Lifo/0

我需要做的是检索conversation_id,我可以在其中指定与其关联的user_id,并检索与这些user_ids 关联的conversation_id。

第一个例子:假设我想获取只有用户 1000001 和 1000002 与之关联的对话 ID。将提取的正确对话 ID 是 10。

第二个示例:假设我想获取只有用户 1000001、1000002 和 1000003 与其关联的对话 ID。将提取的正确对话 ID 是 20。

...等等。

另请注意,当只有一个 user_id 与对话 ID 关联时,这种情况就不会发生。

我在这里发布了我的第一个问题,但后来意识到我需要能够提取一个有 2 个或更多(最多 16 个)指定 user_id 与之关联的对话 ID:MySQL: Retrieving ID where exactly 2 rows share the same ID but have different userIDs

我收到的答案之一是,通过在 IN 子句中指定 user_ids,然后将用户总数放入 COUNT(DISTINCT user_id) 子句,它可以适用于 2 个或更多 user_id。然而,这似乎是最慢的答案性能,并且似乎仅当 user_id_2 键是可能的键(包含对话_id 和 user_id)时才在 EXPLAIN 中使用对话_id 键。

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(*) AND 
  -- number of unique user_id is 2
  COUNT(DISTINCT user_id) = 2

非常感谢您的帮助!

最佳答案

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
( id SERIAL PRIMARY KEY
, user_id int  NOT NULL
, conversation_id int NOT NULL
, UNIQUE(user_id,conversation_id)
, INDEX(conversation_id,user_id)  
);

INSERT INTO my_table (id, user_id, conversation_id) VALUES
(1, 1, 10),
(2, 2, 10),
(3, 1, 20),
(4, 2, 20),
(5, 3, 20),
(6, 1, 30),
(7, 2, 30),
(8, 3, 30),
(9, 4, 30);

SELECT x.conversation_id
  FROM my_table x
  LEFT
  JOIN my_table y
    ON y.conversation_id = x.conversation_id
   AND y.user_id NOT IN(1,2)
 WHERE x.user_id IN (1,2)
   AND y.id IS NULL
 GROUP
    BY x.conversation_id
HAVING COUNT(*) = 2;
+-----------------+
| conversation_id |
+-----------------+
|              10 |
+-----------------+

关于MySQL:检索与其关联的 x 个 user_ids 的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141833/

相关文章:

php - Mysql大数据库迁移

mysql - 无法连接到 Docker 内的 MySQL 服务器

php - 对 ZenCart 的地址簿条目执行加入

具有非空空日期字段的 Mysql INSERT 查询。是否可以?

MySQL 选择记录集中的 WHERE

mysql - 不要带一排 table

php - 我如何在订单页面中调用我的mysqli?

mysql - MySQL 数据库事务是否会破坏使用 RefreshDatabase 或 DatabaseTransactions 的 Laravel PHPUnit 测试?

mysql - SQL表——如何编写查询来确定一支球队是上半年得分多还是下半年得分多

MySQL 多对一设计决策