Используйте группировку по и имея со счетом в sql - PullRequest
0 голосов
/ 11 марта 2020

Вот мой стол

-----------------
| id | uid| pass|
|----------------
| 1  | 1  | pass|
| 2  | 2  | fail|
| 3  | 1  | pass|
| 4  | 2  | pass|
| 5  | 3  | pass|
-----------------

Вот что я хочу

-----------------
| id | uid| pass|
|----------------
| 1  | 1  | pass|
| 3  | 1  | pass|
-----------------

Я пробовал с этим sql

select id,uid,pass
from user
group by id,uid,pass
having count(uid)=2 and pass = pass

Это SQL не работает. Я уже посмотрел на все вопросы, связанные с моей проблемой. но я не смог найти то, что хочу.

Пожалуйста, помогите мне. Любой отзыв, пожалуйста

Ответы [ 4 ]

0 голосов
/ 11 марта 2020

Сначала вам нужно определить идентификатор пользователя, который соответствует критериям ...

SELECT uid FROM `user` WHERE pass = 'pass' GROUP BY uid HAVING COUNT(*) = 2

Затем вы используете это, чтобы получить записи, которые способствовали этому ....

SELECT u.*
FROM `user` AS u
WHERE u.pass = 'pass' 
   AND u.uid IN (thequeryabove)
0 голосов
/ 11 марта 2020

Вы можете выполнить агрегацию:

select uid
from user u
group by uid
having count(id) = 2 and min(pass) = max(pass) and min(pass) = 'pass';

Если вы хотите заполнить строку, используйте функцию окна:

select u.*
from (select u.*, 
             max(case when pass = 'fail' then 1 else 0 end) over (partition by uid) as fail_flag,
             count(*) over (partition by uid) as cnt
      from user u
     ) u
where fail_flag = 0 and cnt > 1;
0 голосов
/ 11 марта 2020

Если вам нужны строки для идентификаторов с двумя проходами:

select u.*
from (select u.*, count(*) over (partition by uid) as cnt
      from user u
      where pass = 'pass'
     ) u
where cnt = 2;

Если вы также хотите, чтобы они не имели сбоев, используйте условную логику c:

select u.*
from (select u.*, 
             sum(case when pass = 'pass' then 1 else 0 end) over (partition by uid) as cnt_pass,
             sum(case when pass = 'fail' then 1 else 0 end) over (partition by uid) as cnt_fail
      from user u
      where pass = 'pass'
     ) u
where cnt_pass = 2 and cnt_fail = 0;

Здесь - это дБ <> скрипка.

0 голосов
/ 11 марта 2020
select uid, count(pass) as "Passing Results"
from user
where pass = 'pass'
group by uid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...