Как я могу объединить несколько таблиц SQL, используя идентификаторы? - PullRequest
135 голосов
/ 24 марта 2012

У меня есть 4 разных стола, к которым я хочу присоединиться. Таблицы структурированы по столбцам следующим образом:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Начиная с Таблицы A, я понимаю, как СОЕДИНИТЬ таблицы A и C, используя b, поскольку b имеет Первичные ключи для этих таблиц. Я хочу иметь возможность присоединиться к таблице TableD на TableA. Ниже приведен мой SQL-оператор, который сначала объединяет таблицы A и B, а затем соединяет его с C:

SELECT TableA.*, TableB.*, TableC.* FROM (TableB INNER JOIN TableA
ON TableB.aID= TableA.aID)
INNER JOIN TableC ON(TableB.cID= Tablec.cID)
WHERE (DATE(TableC.date)=date(now())) 

Когда я пытаюсь добавить еще одно объединение, чтобы включить D, я получаю сообщение об ошибке «TableD» неизвестно:

 SELECT TableA.*, TableB.*, TableC.*, TableD.* FROM (TableB INNER JOIN TableA
    ON TableB.aID= TableA.aID)
    INNER JOIN TableC ON(TableB.cID= Tablec.cID)
    INNER JOIN TableA ta ON(ta.dID= TableD.dID)
    WHERE (DATE(TableC.date)=date(now())) 

Ответы [ 4 ]

289 голосов
/ 24 марта 2012

Вы хотите что-то более похожее на это:

SELECT TableA.*, TableB.*, TableC.*, TableD.*
FROM TableA
    JOIN TableB
        ON TableB.aID = TableA.aID
    JOIN TableC
        ON TableC.cID = TableB.cID
    JOIN TableD
        ON TableD.dID = TableA.dID
WHERE DATE(TableC.date)=date(now()) 

В вашем примере вы на самом деле не включаете TableD.Все, что вам нужно сделать, это выполнить еще одно соединение, как вы делали раньше.

Примечание: вы заметите, что я удалил многие из ваших скобок, поскольку они действительно не нужны в большинстве случаев, когда они у вас были, и только добавляет путаницы при попытке прочитать код.Правильное вложение - лучший способ сделать ваш код читабельным и выделенным.

24 голосов
/ 24 марта 2012
SELECT 
    a.nameA, /* TableA.nameA */
    d.nameD /* TableD.nameD */
FROM TableA a 
    INNER JOIN TableB b on b.aID = a.aID 
    INNER JOIN TableC c on c.cID = b.cID 
    INNER JOIN TableD d on d.dID = a.dID 
WHERE DATE(c.`date`) = CURDATE()
4 голосов
/ 24 марта 2012

Вы не присоединились к TableD, просто выбрали ПОЛЕ TableD (dID) из одной из таблиц.

2 голосов
/ 04 ноября 2013

Простой код INNER JOIN VIEW ....

CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...