Невозможно получить правильные данные по нескольким соединениям


У меня есть следующие таблицы и примеры данных:

Table: activities
+------------------+---------------+
| activity_id (PK) | activity_name |
+------------------+---------------+
|               18 | Bicycling     |
|               19 | Running       |
+------------------+---------------+

Table: activity_attributes
+------------------+-------------------+
| activity_id (FK) | attribute_id (FK) |
+------------------+-------------------+
|               18 |                55 |
|               18 |                56 |
|               18 |                57 |
|               19 |                56 |
+------------------+-------------------+

Table: attributes
+-------------------+----------------+
| attribute_id (PK) | attribute_name |
+-------------------+----------------+
|                55 | City           |
|                56 | Duration       |
|                57 | Bike           |
+-------------------+----------------+

Table: attributes_options
+-------------------+---------------+
| attribute_id (FK) | option_id(FK) |
+-------------------+---------------+
|                55 |            56 |
|                55 |            57 |
|                57 |            58 |
|                57 |            59 |
|                57 |            60 |
|                57 |            61 |
+-------------------+---------------+

Table: options
+----------------+---------------+
| option_id (PK) |  option_name  |
+----------------+---------------+
|             56 | Stockholm     |
|             57 | Vasteras      |
|             58 | My own        |
|             59 | Rented bike   |
|             60 | Borrowed bike |
|             61 | My old bike   |
+----------------+---------------+

На данный момент мой запрос выглядит так:

SELECT * 
FROM activities a 
LEFT JOIN activity_attributes aa ON a.activity_id = aa.activity_id 
LEFT JOIN attributes at ON aa.attribute_id = at.attribute_id 
LEFT JOIN attributes_options ao ON at.attribute_id = ao.attribute_id 
LEFT JOIN options o ON ao.option_id = o.option_id

Однако он возвращает null attribute_id для атрибутов, которые не имеют соответствующих опций (в данном случае "длительность"). Я пробовал с разными соединениями, но в итоге этот запрос возвращает самые точные данные, но все же не все, что я ищу.

Это первый раз, когда я работаю с реляционными базами данных, и я пытаюсь обернуть свой подумайте об этом, что я могу сделать, чтобы вернуть правильный attribute_id 56 для этих примеров?

1 2

1 ответ:

Причина, по которой вы видите attribute_id как null, заключается в том, что он является null внутри таблицы attributes_options. Это имеет смысл, потому что для этих примеров нет выбора.

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

SELECT a.activity_id, a.activity_name, at.attribute_id, at.attribute_name, o.option_id, o.option_name
FROM activities a
LEFT JOIN activity_attributes aa ON aa.activity_id = a.activity_id
LEFT JOIN attributes at ON at.attribute_id = aa.attribute_id
LEFT JOIN attributes_options ao ON ao.attribute_id = at.attribute_id
LEFT JOIN options o ON o.option_id = ao.option_id;

Вот примерSQL Fiddle , который показывает мой запрос и ваш, так что вы можете видеть разницу в результатах бок о бок.

В другими словами, Не выбирайте столбцы из присоединяемых таблиц (activity_attributes и attributes_options), а выберите значения из отдельных таблиц (activities, attributes и options).