Select 仅限特定值

Select certain value only

我有2个table,但我只想查询'rejected'状态, 意味着我需要查询用户仅拒绝状态的结果,而不是批准 & 拒绝,批准 提交 table

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

下面是我想要达到的结果:

但我仅通过 'rejected' 外部加入结果查询,但仍有一些 'approved' 用户结果。

但是通过上面的查询,我得到了这个结果。

我想查询的是,查询提交状态只有'rejected',完全忽略'approved','approve or reject'结果。

我已经找到了一个解决方案,它使用 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'

您可以使用如下 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'

你为什么使用左外连接?我相信简单的加入会让你得到结果..

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/#!9/1e9da/1