Как я могу объединить несколько таблиц SQL с помощью идентификаторов?

142

У меня есть 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())) 
солнце
источник

Ответы:

304

Вам нужно что-то вроде этого:

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. Все, что вам нужно сделать, это выполнить еще одно соединение, как вы это делали раньше.

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

Джастин Пихони
источник
2
не будет выбирать tableN. * дублировать все совпадающие идентификаторы первичного ключа в метках столбцов? (в вопросе не указывалось, какой результат желателен, но обычно вы не хотите этого делать, я думаю)
Хизер Старк,
6
Могу я спросить, почему JOINTableCэто так, ON TableC.cID = TableB.cIDа почему нет TableC.cID = TableA.cID. Я предположил, что мы присоединяемся TableAк другим трем столам.
emihir0
25
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

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

Chriseyre2000
источник
2

Простой код 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;
Ману RS
источник
Не использовать структуру таблицы OP ?!
Istiaque Ahmed