Написать пользовательский запрос SQL для нескольких счетчиков - PullRequest
0 голосов
/ 14 мая 2018

У меня есть таблица в 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
)

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Попробуйте это:

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, но эта структура должна дать вам хорошую отправную точку.

0 голосов
/ 14 мая 2018

попробуйте это:

$ users = DB :: select ("select count () от пользователя, где username = '$ username" и (username in (выберите имя пользователя от пользователя, где group_name in (' A ',' B '), имеющий count ()> 1 группа по имени пользователя) или group_name = 'C') ");

0 голосов
/ 14 мая 2018

Вы можете написать свое необработанное выражение, используя 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...