Соединение из другой таблицы несколько раз в запросе MySQL - PullRequest
1 голос
/ 07 ноября 2011

Я пытаюсь выполнить несколько объединений в одной и той же таблице MySQL, но не получаю ожидаемых результатов.Надеюсь, кто-то может указать на мою ошибку (ы).

Table 1 -  cpe Table

|id | name
|----------
| 1 | cat
| 2 | dog
| 3 | mouse
| 4 | snake
-----------

Table 2 - AutoSelect

|id  | name   |  cpe1_id |  cpe2_id  | cpe3_id |
|-----------------------------------------------
| 1  | user1  |  1       |  3        | 4       |
| 2  | user2  |  3       |  1        | 2       |
| 3  | user3  |  3       |  3        | 2       |
| 4  | user4  |  4       |  2        | 1       |
------------------------------------------------

Я хотел бы видеть вывод

user1 | cat   | mouse  |  snake  |
user2 | mouse | snake  |  dog    | 
..etc

Вот что я пытался

SELECT * FROM AutoSelect
LEFT JOIN cpe ON 
( cpe.id = AutoSelect.cpe1_id ) AND
( cpe.id = AutoSelect.cpe2_id ) AND
( cpe.id = AutoSelect.cpe3_id )

Я получаю пустые результаты.Я думал, что знаю, как сделать эти объединения, но, очевидно, когда я пытаюсь сопоставить cpe? _Id с именем таблицы cpe.

Заранее благодарен за любую помощь.

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Вам нужно присоединиться 3 раза.В настоящее время ваш запрос объединяется только 1 раз с 3 критериями в отношении объединения.Это должно сделать:

SELECT a.name, cpe1.name, cpe2.name, cpe3.name FROM AutoSelect as a
LEFT JOIN cpe as cpe1 ON ( cpe1.id = a.cpe1_id ) 
LEFT JOIN cpe as cpe2 ON ( cpe2.id = a.cpe2_id ) 
LEFT JOIN cpe as cpe3 ON ( cpe3.id = a.cpe3_id )

И вы, вероятно, имеете в виду INNER JOIN, а не LEFT JOIN, если в вашей таблице AutoSelect не разрешены значения NULL.

0 голосов
/ 15 октября 2013

В этом случае ваше решение не даст хорошую динамическую базу данных.Есть и другие способы составления комбинаций из нескольких таблиц.Я могу показать вам по собственной базе данных, что вы должны использовать и когда вы должны использовать это решение.Схема на голландском, но вы, вероятно, поймете ключевые слова.

Как и вы, мне приходилось комбинировать мои ветряные мельницы с счетчиком киловатт-часов, который должен измерять выработку энергии на моих ветряных мельницах.В этом случае вы должны сделать еще одну таблицу (в моем случае molenkWhlink).Убедитесь, что ваши таблицы относятся к типу INNODB (для создания внешних ключей).То, что я сделал, это объединил мои счетчики и мельницы, поместив указатель (внешний ключ) их идентификатора (на голландском языке Volgnummer) в новую таблицу.Преимущество, которое вам может не понадобиться, но я определенно сделал это, заключается в том, что я смог расширить дополнительную таблицу с помощью информации о подключении и отключении, такой как метки времени и значения счетчика при соединении или отключении.Это делает вашу базу данных более динамичной.

В моем случае у меня также был стол для измерений (metingoverzicht).Как вы можете видеть на схеме, у меня есть 2 линии, идущие от Metingoverzicht до molenkwhlink.Причина этого довольно проста.Все измерения, которые я приму, будут сохранены в таблице Metingoverzicht.Ежедневные измерения (которые запланированы) будут иметь специальное логическое значение, но незапланированные измерения также будут сохранены здесь, при отключенном боллеане.При переключении измерителей мне нужно конечное значение от уходящего измерителя и начальное значение от нового измерителя, чтобы вычислить значение сегодняшнего производства энергии.Вот где приходит ваше решение, и дополнительная таблица не будет работать.Обычно, когда вам нужно только одно значение из другой таблицы, используется JOIN.Проблема в этом случае заключается в том, что у меня есть 2 идентификатора meassurementID в одной ссылке (1 для подключения и 1 для отключения).Они оба указывают на один и тот же столбец таблицы, потому что они оба должны содержать информацию одного и того же типа.Именно тогда вы можете использовать двойное соединение от одного стола к другому.Потому что оба значения будут использоваться только один раз, и их просто необходимо сохранить в другом месте, чтобы избежать сохранения одного действия в разных местах, чего всегда следует избегать.

http://s1101.photobucket.com/user/Manuel_Barcelona/media/schemedatabase.jpg.html

0 голосов
/ 07 ноября 2011

Я думаю, что ваш дизайн неправильный.

С такими таблицами вы получите то, что должно быть в реляционных базах данных:

table 1 : animal
 id  name
 1   cat
 2   dog
 3   mouse
 4   snake


table 2 : user
|id  | name   |
|--------------
| 1  | user1  |
| 2  | user2  |
| 3  | user3  |
| 4  | user4  |

table 3 : association
|id_user | id_animal|
|--------------------
| 1      | 1        |
| 1      | 3        |
| 1      | 4        |
| 2      | 3        |
| 2      | 1        |
| 2      | 2        |
| 3      | 3        | 
| 3      | 2        
| 4      | 4        |
| 4      | 2        |
| 4      | 1        |
---------------------

Тогда:

выберите имя пользователя u.name, a.name пользователя u, животное a, задницу ассоциации, где ass.user_id = u.id и ass.animal_id = a.id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...