Выберите только определенное значение

У меня есть 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 |
+---------+----+--------+--------+----------+

http://sqlfiddle.com/

Вы можете использовать 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'
Другие вопросы по тегам