0

我遇到了以下问题:

表的 SQL 查询:

CREATE TABLE IF NOT EXISTS `thread_users` (
  `thread_id` bigint(20) unsigned NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`thread_id`,`user_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

假设我有这些数据:

INSERT INTO `thread_users` (`thread_id`, `user_id`) VALUES
(1, 1),
(1, 2),
(2, 1),
(2, 2),
(2, 3),
(3, 1),
(3, 4);

我需要检索仅由 2 个 id 引用的 thread_id:X 和 Y(均已知)。使用上述数据,我希望能够检索仅存在 user_id = 1 & user_id = 2 的 thread_id。

我肯定知道这张桌子:

  • 如果一个线程仅由 2 个用户组成,则没有其他线程仅包含这两个 id。(插入前检查mysql外部)

  • 用户不能多次出现在线程中。(首要的关键)

我想解决这个问题:

  • 求和 (user_id 1 + user_id 2) 搜索等于该结果 + (user_id = X OR user_id = Y) 的 SUM。但是我无法正确编写此查询,并且我还需要检查该线程中 user_id 的数量...

  • 显然:在线程上的user_id数量等于2并且user_id等于X&Y的地方搜索id。

谢谢你们的帮助!

4

3 回答 3

1

像这样的东西

SELECT thread_id FROM thread_users WHERE user_id IN(1,2) GROUP BY thread_id
HAVING COUNT(user_id)=2

SQL小提琴

于 2013-10-26T21:24:08.257 回答
1
SELECT tu1.thread_id
FROM thread_users AS tu1
INNER JOIN thread_users AS tu2
  ON tu1.thread_id = tu2.thread_id
  AND tu1.user_id <> tu2.user_id
LEFT OUTER JOIN thread_users AS tu3
  ON tu1.thread_id = tu3.thread_id
  AND tu1.user_id <> tu3.user_id
  AND tu2.user_id <> tu3.user_id
WHERE tu1.user_id = 1
  AND tu2.user_id = 2
  AND tu3.user_id IS NULL
于 2013-10-26T21:32:49.900 回答
0

我认为这比 JOIN 示例更简单,也更快:

SELECT `thread_id`, GROUP_CONCAT(`user_id`) AS this_match FROM `thread_users` 
GROUP BY `thread_id` HAVING this_match = '1,2'
于 2013-10-26T21:30:54.923 回答