MYSQL - Несколько и условие для разных значений в одном столбце - PullRequest
0 голосов
/ 02 октября 2018

У меня есть имя таблицы results

+----+------+------+--------+
| ID | USER | EXAM | RESULT |
+----+------+------+--------+
|  1 |   10 | ssc  | 4.2    |
|  2 |   10 | hsc  | 4.5    |
|  3 |   11 | ssc  | 4.0    |
|  4 |   11 | hsc  | 4.4    |
|  5 |   12 | ssc  | 5.0    |
|  6 |   12 | hsc  | 5.0    |
|  7 |   13 | ssc  | 3.0    |
|  8 |   13 | hsc  | 3.0    |
+----+------+------+--------+

Моя цель - получить отдельных пользователей с определенным счетом.Например, результат ssc> 4.0 и результат hsc> 4.2.

Если я добавлю что-то вроде этого

select distinct user from results where 
( exam = 'ssc' and result > 4.0 ) 
and 
( exam = 'hsc' and result > 4.2 ) 

Он вернется пустым, поскольку экзамен не может быть равен 'ssc' и 'hsc' вв то же время.Если я поставлю или условие в середине, как это

select distinct user from results where 
( exam = 'ssc' and result > 4.0 ) 
or
( exam = 'hsc' and result > 4.2 ) 

Это будет включать в себя пользователя 11, что является неожиданным, потому что наша цель состоит в том, чтобы отфильтровать пользователей, имеющих более 4,0 в SSC.

Мой ожидаемыйвывод будет примерно таким:

10
12

Есть ли способ, которым мы можем это сделать?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

использовать условную агрегацию для фильтрации

select user from tablename
group by user
having 
sum(case when exam='ssc' and result>4.0 then 2 when exam='hsc' and result>4.2 then 1 end)=3
0 голосов
/ 02 октября 2018

Можно попытаться использовать агрегатную функцию условия в HAVING и проверить, установлены ли оба условия.

CREATE TABLE T (
   ID INT,
   `USER` INT,
   EXAM VARCHAR(50),
   RESULT FLOAT
);

INSERT INTO T VALUES (1,10,'ssc', 4.2);
INSERT INTO T VALUES (2,10,'hsc', 4.5);
INSERT INTO T VALUES (3,11,'ssc', 4.0);
INSERT INTO T VALUES (4,11,'hsc', 4.4);
INSERT INTO T VALUES (5,12,'ssc', 5.0);
INSERT INTO T VALUES (6,12,'hsc', 5.0);
INSERT INTO T VALUES (7,13,'ssc', 3.0);
INSERT INTO T VALUES (8,13,'hsc', 3.0);

Запрос 1 :

SELECT USER  
FROM T 
GROUP BY USER 
HAVING 
    SUM(exam = 'ssc' and result > 4.0) = 1 
AND 
    SUM(exam = 'hsc' and result > 4.2) = 1

Результаты :

| USER |
|------|
|   10 |
|   12 |
0 голосов
/ 02 октября 2018

один метод с использованием соединения

  select t1.* from 
(
select * from results where EXAM ='ssc' and RESULT>4.0
    ) t1
  join
(
    select * from  results where EXAM ='hsc' and RESULT>4.2
) as t2 on t1.USER=t2.USER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...