2015-07-22 3 views
0

Моя структура таблицы выглядит следующим образом:ВЫБРАТЬ запрос для трех соединенных таблиц

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 
+0

Как насчет 'user_id' и' subversion_id' вместо двух разных простых 'id' в вашем первоначальном объявлении? – zipzit

+0

Я делал эти запросы во многих разных формах, этот только для базовой концепции того, что я использовал, но он не работает – user1480742

+0

wow. Я только что нашел http://sqlfiddle.com/ Позвольте мне посмотреть, могу ли я воспроизвести (или вы можете сделать то же самое ....) намек, подсказка! – zipzit

ответ

0

я нашел решение для моей проблемы в форма запроса:

//Query for all other users 
    $res2 = mysqli_query($conn,"SELECT DISTINCT id, username FROM users 
         WHERE id NOT IN ( 
           SELECT DISTINCT u.id FROM users AS u 
           INNER JOIN subversion_user ON u.id = subversion_user.user_id 
           WHERE subversion_user.subversion_id = '$subversionID' 
          )"); 
0

У вас есть три таблицы, и вы хотите присоединиться к ним. Кроме того, вы хотите найти записи, которые «отсутствуют» из обычного внутреннего соединения. В этом случае вам нужно внешнее соединение. (К сожалению, MySql не включает в себя полное внешнее соединение)

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

Вещи, которые я узнал здесь:

+0

Я не думаю, что мы поняли друг друга, я отрезал мой вопрос с моим новым запросом, попробуйте, так что, возможно, теперь более ясно, что я хочу – user1480742

Смежные вопросы