无法通过多个连接获得正确的数据
Unable to get correct data over several joins
我有以下表格和示例数据:
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
但是,对于没有任何对应选项的属性(在本例中为 "Duration"),它 return 为 null attribute_id。我尝试过不同的连接,但最后这个查询 return 是最准确的数据,但仍然不是我要找的所有内容。
这是我第一次使用关系数据库,我正在努力思考它,我可以做些什么来 return 正确的 attribute_id 56示例?
您看到 attribute_id
为 null 的原因是因为它在 attributes_options
table 中为 null。这是有道理的,因为这些示例没有选项。
要解决此问题,您应该从您希望条目存在的 table 中显式设置您想要 select 的列。所以不用 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 示例,显示了我的查询和您的查询,因此您可以并排查看结果的差异。
换句话说,不要 select 加入 table 列(activity_attributes 和 attributes_options),而是 select 值单独 tables(活动、属性和选项)。
我有以下表格和示例数据:
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
但是,对于没有任何对应选项的属性(在本例中为 "Duration"),它 return 为 null attribute_id。我尝试过不同的连接,但最后这个查询 return 是最准确的数据,但仍然不是我要找的所有内容。
这是我第一次使用关系数据库,我正在努力思考它,我可以做些什么来 return 正确的 attribute_id 56示例?
您看到 attribute_id
为 null 的原因是因为它在 attributes_options
table 中为 null。这是有道理的,因为这些示例没有选项。
要解决此问题,您应该从您希望条目存在的 table 中显式设置您想要 select 的列。所以不用 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 示例,显示了我的查询和您的查询,因此您可以并排查看结果的差异。
换句话说,不要 select 加入 table 列(activity_attributes 和 attributes_options),而是 select 值单独 tables(活动、属性和选项)。