我在MySQL中有这个表,包含group_name
和username
,如下所示:
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
)
答案 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')");