检查该表是否有列表中所有ID的记录

时间:2018-02-02 19:49:04

标签: mysql

我有一个用户列表,一个事件列表,以及一个将用户连接到他们参加的活动的列表。

如果用户参加了某个月内的所有活动,我希望能够显示这个,但我似乎无法找到最佳方法。

我目前的解决方案是获取一个月内所有事件的列表,然后获取特定用户的所有event_user行,并确保它们与服务器端代码匹配,但我希望能找到更优雅的东西。切掉所有这些,并在mysql查询中完全完成。

示例sql fiddle在这里:http://sqlfiddle.com/#!9/fda31e/23在此示例中,用户1应该返回,但用户2不应该返回。在真正的桌子上有外键等,但我并没有把它们放在小提琴上。

我尝试过的解决方案是上面的小提琴,但是我无法弄清楚如何在where子句中使用连接事件。

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(6) unsigned NOT NULL,
  `name` text NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `users` (`id`, `name`) VALUES
  (1, 'test1'),
  (2, 'test2');

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(6) unsigned NOT NULL,
  `date` timestamp NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `events` (`id`, `date`) VALUES
  ('1', '2018-01-02 17:00:00'),
  ('2', '2018-01-03 17:00:00'),
  ('3', '2018-01-04 17:00:00');


CREATE TABLE IF NOT EXISTS `user_events` (
  `user_id` int(6) unsigned NOT NULL,
  `event_id` int(6) unsigned NOT NULL,
  PRIMARY KEY (`user_id`, `event_id`)
);
INSERT INTO `user_events` (`user_id`, `event_id`) VALUES
  (1, '1'),
  (1, '2'),
  (1, '3'),
  (2, '1'),
  (2, '3');

select user_id, group_concat(event_id) eventIds 
from user_events 
where eventIds = (select group_concat(id) from events where month(date) = 1)
group by user_id;

1 个答案:

答案 0 :(得分:1)

尝试以下查询:

select user_id,count(event_id) as cnt,group_concat(event_id separator ',') as Event_ids
from user_events
group by user_id
having cnt = (select count(id) from events where month(date) = 1);

DEMO