检索由两个ID引用的一个id

时间:2013-10-26 21:19:50

标签: mysql

我遇到了以下问题:

表的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(都知道)。 有了上面的数据,我希望能够检索thread_id,其中只有user_id = 1& user_id = 2存在。

我对此表肯定了解:

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

  • 用户不能多次出现在一个帖子中。 (主键)

我想解决这个问题:

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

  • 显然:搜索id,其中线程上的user_id数等于2,其中user_id等于X&收率

感谢帮助人员!

3 个答案:

答案 0 :(得分:1)

像这样的东西

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

SQL fiddle

答案 1 :(得分: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

答案 2 :(得分:0)

我认为这比JOIN示例简单一点,而且速度更快一些:

SELECT `thread_id`, GROUP_CONCAT(`user_id`) AS this_match FROM `thread_users` 
GROUP BY `thread_id` HAVING this_match = '1,2'