3 回答
TA贡献1797条经验 获得超6个赞
我认为以下解决方案也可以:
SELECT DISTINCT event_id FROM events_users GROUP BY event_id
HAVING GROUP_CONCAT(DISTINCT user_id ORDER BY user_id asc SEPARATOR ',')="23,32"
您可以在查询之前对 user_id 数组进行排序和连接。
Laravel 查询构建器方法:
$user_id_str=implode(",",[23,32]);
DB::table('events_users')
->selectRaw("distinct event_id")
->groupBy('event_id')
->havingRaw("GROUP_CONCAT(DISTINCT user_id ORDER BY user_id asc SEPARATOR ',')='$user_id_str'")->get();
TA贡献1874条经验 获得超12个赞
一种 SQL 方法是使用基于条件聚合的过滤。我们使用事件聚合GROUP BY,然后使用HAVING子句过滤掉行:
SELECT event_id
FROM events_users
GROUP BY event_id
HAVING
SUM(user_id = 23) -- event exists for user = 23
AND
SUM(user_id = 32) -- event exists for user = 32
AND
NOT SUM(user_id NOT IN (23,32)) -- no other row exists other than user 23 and 32
TA贡献1780条经验 获得超5个赞
此解决方案不适用于具有相同类型的独家成员的多个事件的情况。这是不正确的解决方案。我道歉。 Phil 的解决方案有效,因此我将其标记为解决方案。
我有适合我的解决方案。如果您认为有缺陷,请告诉我。
DB::table('events_users')
->whereIn('user_id', [23, 32])
->havingRaw('count(user_id) = ?', [2])
->get();
这给了我只有用户 23 和 32 的独家活动,没有其他成员。我假设给定的用户和用户数量是互斥的,因为在事件中不会有重复的用户条目。让我知道这是否在任何情况下都失败了。
- 3 回答
- 0 关注
- 137 浏览
添加回答
举报