mysql - 三个连接表的 SELECT 查询

标签 mysql database select

我的表结构如下所示:

 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)

My SQLfiddle

我的测试代码:

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) |

我在这里学到的东西:

关于mysql - 三个连接表的 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565172/

相关文章:

mysql - 如何跳过 sqlSave() 命令中的主键?

mysql - 内连接查询 - 3 个表

php - 这可以在 MySQL 查询中完成,还是需要在 PHP 中完成? (服务器端)

ruby-on-rails - Rails - 具有多种值(value)类型的 EAV 模型?

mysql - 如果列中没有结果,则获取 0 值 -- MySQL

sql - 其中执行第一个 WHERE 子句或 JOIN 子句

php - MYSQL LEFT JOIN 从空表返回值

sql - 简单的 Select 语句不返回任何结果

mysql - 在 RDS for MySQL 中创建没有权限的用户失败,错误 1396

mysql - 在mysql中选择最大记录