基于独占值获取结果:mysql & laravel

由于我的词汇量较弱,我不确定我的问题的标题是否正确,但我试图尽可能详细地解释我的需求。感谢您通过。


我有一张设计用来存储活动成员的表。示意图如下。


event_id | user_id

---------|---------------------

1        | 23

1        | 32

3        | 23

3        | 32

3        | 67

我想event_id根据提供的值进行检索,user_id但我只想显示event_id专门为用户提供的值。


例如,根据上表的图表,如果我只给用户值 = (23, 32),那么我应该只检索事件 1,而不是 1 和 3,即使事件 3 也有上述用户。我正在尝试仅检索给定用户独有的事件。


这是我的 laravel 实现:


DB::table('events_users')->whereIn('user_id', [23, 32])

                         ->get();

这会获取所有具有上述用户的事件,但我想要基于上图的唯一具有 id 1 的事件。我当前的解决方案是在从查询结果中将每个事件中的用户计数与所需计数相匹配的位置之后,再编写一层代码。例如,如果我只搜索 2 个用户独占事件,那么我将根据事件中的总用户数从结果中过滤掉事件。对不起,我的词汇量很弱,但我正在尽力解释。


有没有办法通过单个查询来实现我想要的?


临摹微笑
浏览 138回答 3
3回答

FFIVE

我认为以下解决方案也可以: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();

HUWWW

一种 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

翻阅古今

此解决方案不适用于具有相同类型的独家成员的多个事件的情况。这是不正确的解决方案。我道歉。 Phil 的解决方案有效,因此我将其标记为解决方案。我有适合我的解决方案。如果您认为有缺陷,请告诉我。DB::table('events_users')                    ->whereIn('user_id', [23, 32])                    ->havingRaw('count(user_id) = ?', [2])                    ->get();这给了我只有用户 23 和 32 的独家活动,没有其他成员。我假设给定的用户和用户数量是互斥的,因为在事件中不会有重复的用户条目。让我知道这是否在任何情况下都失败了。
打开App,查看更多内容
随时随地看视频慕课网APP