为多个计数编写自定义SQL查询

时间:2018-05-14 13:42:16

标签: mysql sql laravel laravel-5.2 logic

我在MySQL中有这个表,包含group_nameusername,如下所示:

ID|group_name|username
----------------------
1 |    A     | user1
----------------------
2 |    B     | user2
----------------------
3 |    C     | user1

...

我有一些看起来像这样的逻辑表达式:

(A & B) || C

这意味着,如果我正在搜索某个用户,则该用户应该在A组和B组中,或者在C组中。

我必须在Laravel中使用自定义表达式检查用户,我的查询将如下所示:

return DB::table('assigned_groups')->where($expression)->where('username', $username)->count();

我认为$expression是我在原始SQL中编写的逻辑表达式。我必须检查是否可以找到一些$username至少一次分配给所需的组。

现在我只有一个$表达式的伪代码:

select count(*)
having (
    (count(select(*) where group_name = A) > 0 
    and count(select(*) where group_name = B) > 0)
    or count(select(*) where group_name = C) > 0
)

如何正确编写此表达式?如何更改Laravel查询和$expression本身?

UPD:现在我的SQL看起来像这样,而且几乎是

SELECT count(*) FROM `assigned_groups`
where username = 'user1'
having (
    (count(case group_name when 'A' then 1 else null end) > 0 
    and count(case group_name when 'B' then 1 else null end) > 0)
    or count(case group_name when 'C' then 1 else null end) > 0
)

3 个答案:

答案 0 :(得分:1)

您可以使用havingRaw

编写原始表达式
DB::table('assigned_groups')
->where('username', $username)
->havingRaw("(count(case group_name when 'A' then 1 else null end) > 0 
    and count(case group_name when 'B' then 1 else null end) > 0)
    or count(case group_name when 'C' then 1 else null end) > 0")
->count();
使用sum()

或更短

DB::table('assigned_groups')
->where('username', $username)
->havingRaw("(sum(group_name ='A') > 0 and sum(group_name = 'B') > 0) or sum(group_name = 'C') > 0")
->count();

答案 1 :(得分:0)

试试这个:

return DB::table('assigned_groups')
    ->where('username', $username)
    ->andWhere(function($query) use ($groupAandB, $groupC) {
        $query->whereIn('group_name', $groupAandB)
              ->orWhereIn('group_name', $groupC);
    })
    ->count();

我实际上不确定是否有orWhereIn方法,但这种结构应该给你一个很好的起点。

答案 2 :(得分:0)

试试这个:

$ users = DB :: select(" select count()来自用户,其中username =' $ username'和(用户名)(从用户中选择用户名,其中group_name in(& #39; A',' B')按用户名计数()> 1组)或group_name =' C')");