我的表结构如下所示:
subversions(
id INT(10) AUTO_INCREMENT,
version_id INT(10)
name VARCHAR(16) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (version_id) REFERENCES versions(id)
);
/* ^
Many|
To
| Many
v
*/
users(
id INT(10) AUTO_INCREMENT,
name VARCHAR(16) NOT NULL,
password VARCHAR(32) NOT NULL,
PRIMARY KEY (id),
);
带连接表
subversions_users_conjuction(
id INT(10) AUTO_INCREMENT,
subversion_id VARCHAR(16) NOT NULL,
user_id VARCHAR(32) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (subversion_id) REFERENCES subversions(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
我的问题是设计查询以从“用户”中选择所有用户不在 subversions_users_conjuction 使用 subversion_id = SpecificID 并且不获取那些
所以像下面这样:
//Query for all other users
$res2 = mysqli_query($conn,"SELECT DISTINCT i.id, i.username FROM users AS i
NOT IN
SELECT DISTINCT u.id, u.username FROM users AS u
INNER JOIN subversion_user ON u.id = subversion_user.user_id
WHERE subversion_user.subversion_id = '$subversionID'");
但是,这个不起作用 SQL 错误说:
MySQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT IN
SELECT DISTINCT u.id, u.username FROM users AS u
INNER JOI' at line 2
最佳答案
您有三个表,并且您想要加入它们。此外,您还想查找正常内部联接中“丢失”的条目。在这种情况下,您需要一个外部联接。 (不幸的是 mySQL 不包含 FULL OUTER JOIN)
我的测试代码:
CREATE TABLE subversion
(
id INT(10) AUTO_INCREMENT,
name VARCHAR(16) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO subversion (name) VALUES ('Terror');
INSERT INTO subversion (name) VALUES ('Mayhem');
INSERT INTO subversion (name) VALUES ('Bribery');
INSERT INTO subversion (name) VALUES ('Eating Ice Cream');
INSERT INTO subversion (name) VALUES ('Unrest');
INSERT INTO subversion (name) VALUES ('Infiltration');
CREATE TABLE users(
id INT(10) AUTO_INCREMENT,
name VARCHAR(16) NOT NULL,
password VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO users (name, password) VALUES
('Adam', '12345'),('Bill', '78903'), ('Chandra', '56565'),
('David', '34543'), ('Edwina', 'abcde'), ('Faheem', 'jklab'), ('George', 'vfghn'), ('Hank', '2ws3e') ;
CREATE TABLE subversions_users_conjuction(
id INT(10) AUTO_INCREMENT,
subversion_id INT(10) NOT NULL,
user_id INT(10) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (subversion_id) REFERENCES subversion(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
INSERT INTO subversions_users_conjuction (user_id, subversion_id) VALUES
(1,1), (2,2), (3,1), (4,4), (5,5);
我的 LEFT OUTER 查询
SELECT * FROM
users LEFT OUTER JOIN subversions_users_conjuction
ON users.id = subversions_users_conjuction.user_id
LEFT OUTER JOIN subversion ON subversion.id = subversions_users_conjuction.subversion_id
WHERE subversion_id IS NULL;
结果:
| id | name | password | id | subversion_id | user_id | id | name |
|----|--------|----------|--------|---------------|---------|--------|--------|
| 6 | Faheem | jklab | (null) | (null) | (null) | (null) | (null) |
| 7 | George | vfghn | (null) | (null) | (null) | (null) | (null) |
| 8 | Hank | 2ws3e | (null) | (null) | (null) | (null) | (null) |
我在这里学到的东西:
- Database ID naming convention
- 内/外连接
- IS NULL/IS NOT NULL 运算符
- sqlfiddle.com
关于mysql - 三个连接表的 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565172/