【发布时间】:2015-10-30 12:44:03
【问题描述】:
我正在尝试过滤我的表,其中用户在一个表中有一行,而在另一个表中没有一行。这是我的表结构:
这是一个 SQL Fiddle: http://sqlfiddle.com/#!9/6e27ed/2
CREATE TABLE users (
user_id INT(11) AUTO_INCREMENT,
name VARCHAR(25),
PRIMARY KEY(user_id)
);
CREATE TABLE photos (
photo_id INT(11) AUTO_INCREMENT,
user_id INT(11) NOT NULL,
PRIMARY KEY(photo_id)
);
CREATE TABLE blocked (
user_id INT(11) NOT NULL,
blocked_id INT(11) NOT NULL
);
INSERT INTO users (name)
VALUES ('returned'), ('not returned'), ('not returned'), ('not returned');
INSERT INTO photos (user_id)
VALUES (1), (2);
INSERT INTO blocked (user_id, blocked_id)
VALUES (4, 2);
这是我正在尝试的查询:
SELECT u.*, min(p.photo_id)
FROM users u
INNER JOIN photos p using(user_id)
LEFT JOIN blocked b ON b.user_id = 4 AND b.blocked_id = u.user_id
WHERE u.user_id != 4
GROUP BY u.user_id
LIMIT 9;
示例数据很明显应该是什么结果,因为在这个例子中“name”字段填充了"returned", "not returned",仍然返回了user-id 2,但是他应该被LEFT JOIN删除,因为用户 id 4 在阻塞表的阻塞 id 字段中有用户 id 2。
预期表格结果:
+---------+----------+-----------------+
| user_id | name | min(p.photo_id) |
+---------+----------+-----------------+
| 1 | returned | 1 |
+---------+----------+-----------------+
收到查询结果:
+---------+--------------+-----------------+
| user_id | name | min(p.photo_id) |
+---------+--------------+-----------------+
| 1 | returned | 1 |
| 2 | not returned | 2 |
+---------+--------------+-----------------+
【问题讨论】: