我有一个用户列表,一个事件列表,以及一个将用户连接到他们参加的活动的列表。
如果用户参加了某个月内的所有活动,我希望能够显示这个,但我似乎无法找到最佳方法。
我目前的解决方案是获取一个月内所有事件的列表,然后获取特定用户的所有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;
答案 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);