无法通过多个联接获取正确的数据

时间:2015-06-12 12:45:52

标签: mysql database join relational-database jointable

我有以下表格和示例数据:

row3Location

目前我的查询如下:

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   |
+----------------+---------------+

但是,它为没有任何相应选项的属性(在本例中为“Duration”)返回null attribute_id。我尝试过不同的连接,但最后这个查询返回了最准确的数据,但仍然不是我想要的所有内容。

这是我第一次使用关系数据库而我正试图将其包含在内,我该怎样做才能为这些示例返回56的正确attribute_id?

1 个答案:

答案 0 :(得分:2)

您将attributes_options视为null的原因是因为它在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;

{{1}}

以下是SQL Fiddle示例,其中显示了我的查询和您的查询,因此您可以并排查看结果的差异。

换句话说,不要从连接表中选择列(activity_attributes和attributes_options),而是从独立表(活动,属性和选项)中选择值。