Выберите только определенное значение
У меня есть 2 таблицы, но я хотел запросить только статус "отклонено", это означает, что мне нужно запросить результат, что у пользователя есть только статус отклонено, вместо того, чтобы утверждать и отклонять, или утверждать в таблице представлений
Users Table
-----------
id | name
-----------
1 | John
2 | Doe
3 | Testing
4 | Sample
Submission Table
-------------------------------
id | user_id | title | status
-------------------------------
1 | 1 | title1 | approved
2 | 1 | title2 | rejected
3 | 2 | title3 | approved
4 | 2 | title4 | approved
5 | 3 | title5 | rejected
6 | 3 | title6 | rejected
7 | 3 | title7 | rejected
8 | 4 | title8 | approved
9 | 4 | title9 | approved
10| 4 | title10| rejected
11| 4 | title11| rejected
Ниже приведен результат, которого я хотел достичь:
Но я присоединяюсь к результатам запроса только по "отклоненным", но у пользователей все еще есть "одобренный" результат.
но с вышеуказанным запросом, я бы этот результат.
То, что я хотел запросить, это запросить заявки только в статусе "отклонено", полностью игнорировать результат "утвержден", "одобрен или отклонен".
4 ответа
Я уже нашел решение, которое использует WHERE NOT EXISTS
фильтровать approved
результат в представлении
SELECT u.id AS user_id,s.*, u.name
FROM submissions s
LEFT OUTER JOIN users u
ON s.user_id = u.id
WHERE NOT EXISTS (
SELECT USER_ID
FROM submissions tmp
WHERE tmp.User_ID = s.User_ID
AND tmp.status = 'approved'
)
AND STATUS = 'rejected'
Почему вы использовали левое внешнее соединение? Я верю, что простое соединение даст вам результат..
SELECT u.id AS user_id,s.*, u.name
FROM submissions s
JOIN users u
ON s.user_id = u.id AND s.status = 'rejected'
ИЛИ ЖЕ
SELECT u.id AS user_id,s.*, u.name
FROM submissions s
JOIN users u
ON s.user_id = u.id
WHERE s.status = 'rejected'
create table users
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(12) NOT NULL UNIQUE
);
INSERT INTO users VALUES
(1,'John'),
(2,'Doe'),
(3,'Testing'),
(4,'Sample');
create table submissions
(id int not null auto_increment primary key
,userid int not null
,title varchar(12) not null
,status varchar(12) not null
);
insert into submissions values
( 1,1,'title1','approved'),
( 2,1,'title2','rejected'),
( 3,2,'title3','approved'),
( 4,2,'title4','approved'),
( 5,3,'title5','rejected'),
( 6,3,'title6','rejected'),
( 7,3,'title7','rejected'),
( 8,4,'title8','approved'),
( 9,4,'title9','approved'),
(10,4,'title10','rejected'),
(11,4,'title11','rejected');
SELECT u.name
, x.*
FROM submissions x
JOIN users u
ON u.id = x.userid
LEFT
JOIN submissions y
ON y.status = 'approved'
AND y.userid = x.userid
WHERE x.status = 'rejected'
AND y.userid IS NULL;
+---------+----+--------+--------+----------+
| name | id | userid | title | status |
+---------+----+--------+--------+----------+
| Testing | 5 | 3 | title5 | rejected |
| Testing | 6 | 3 | title6 | rejected |
| Testing | 7 | 3 | title7 | rejected |
+---------+----+--------+--------+----------+
Вы можете использовать NOT IN(your exclude criteria)
формат, как показано ниже.
SELECT u.id AS user_id,s.*, u.name
FROM submissions s
LEFT OUTER JOIN users u
ON s.user_id = u.id
WHERE s.user_id NOT IN(
SELECT tmp.user_id
FROM submissions tmp
WHERE tmp.status = 'approved'
)
AND STATUS = 'rejected'