Mysql JOIN из четырех таблиц с двумя ключевыми таблицами - PullRequest
3 голосов
/ 29 сентября 2010

Я не хочу признавать это, поскольку у меня недостаточно знаний о MySQL, когда речь идет о более сложных запросах. По сути, у меня есть четыре таблицы, две из которых содержат данные, которые я хочу вернуть, и две - это реляционные таблицы, связывающие данные. Table A присутствует только для обеспечения наполнителя для Table D.aID.

+--------+ +--------+ +--------+ +-----------+ +-----------+
|Table A | |Table B | |Table C | |  Table D  | |  Table E  |
+---+----+ +---+----+ +---+----+ +---+---+---+ +---+---+---+
|aID|name| |bID|name| |cID|name| |dID|aID|bID| |eID|dID|cID|
+---+----+ +---+----+ +---+----+ +---+---+---+ +---+---+---+
| 1 | a_1| | 1 | b_1| | 1 | c_1| | 1 | 1 | 1 | | 1 | 1 | 1 |
+---+----+ | 2 | b_2| | 2 | c_2| | 2 | 1 | 2 | | 1 | 1 | 2 |
           +---+----+ | 3 | c_3| +---+---+---+ +---+---+---+
                      +---+----+

Связь, созданная с помощью этих таблиц: Table A > Table B > Table C. Данные, которые мне нужны, относятся к отношениям Table B > Table C.

+--------+---------+--------+---------+
|tblB.bID|tblB.name|tblC.cID|tblC.name|
+--------+---------+--------+---------+
|    1   |    a_1  |    1   |   c_1   |
|    1   |    a_1  |    2   |   c_2   |
|    2   |    a_2  |  NULL  |   NULL  |
+--------+---------+--------+---------+

Однако, чтобы убедиться, что я иду по правильному пути, мне нужно захватить Table B отношения Table A > Table B, которому принадлежит Table C. Я понимаю, что я усложняю себе задачу, допуская дублирующиеся значения name, но я бы предпочел иметь маленькие таблицы и более сложные запросы, чем раздутые таблицы и более простые запросы. Я использую запрос

SELECT * FROM `Table E`
LEFT JOIN `Table D` ON (`Table B`.bID = `Table D`.bID)
RIGHT JOIN `Table E` ON (`Table D`.dID = `Table E`.dID))
RIGHT JOIN `Table C` ON (`Table E.cID = `Table C`.cID);

Однако пока это не сработало. При отправке запроса возвращается эта ошибка:

ERROR 1066 (42000): Not unique table/alias: 'Table D'

Есть идеи, как мне заставить это работать? Это вообще возможно?

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Запрос, который вы отправляете, имеет мало общего с той структурой таблицы, которую вы нам дали! Что такое Table D.national_regionID? Или modx.coverage_state?

Обычно не смешивайте левые и правые соединения. Также каждая таблица, используемая в запросе, должна либо следовать за FROM, либо следовать за JOIN. Похоже, вы используете Table B и Table C в условиях соединения, даже не добавляя их в запрос.

0 голосов
/ 30 сентября 2010

Благодаря Мартину Смиту я смог найти решение, которое я публикую здесь.Я надеюсь, что это может помочь кому-то еще.

SELECT  tblB.bID,
    tblB.name,
    tblC.cID,
    tblC.name
FROM Table E 
RIGHT JOIN Table B ON (Table B.bID = Table D.bID)
RIGHT JOIN Table D USING dID
RIGHT JOIN Table C USING cID;
...