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

Mysql 无法通过多个联接获取正确的数据,mysql,database,join,relational-database,jointable,Mysql,Database,Join,Relational Database,Jointable,我有以下表格和样本数据: Table: activities +------------------+---------------+ | activity_id (PK) | activity_name | +------------------+---------------+ | 18 | Bicycling | | 19 | Running | +------------------+--------------

我有以下表格和样本数据:

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
但是,对于没有任何相应选项(在本例中为“持续时间”)的属性,它将返回一个空属性\u id。我尝试了不同的连接,但最终这个查询返回了最准确的数据,但仍然不是我想要的所有数据


这是我第一次使用关系数据库,我正试着总结我的想法,我该怎么做才能为这些示例返回正确的属性id 56?

您之所以将
attribute\u id
视为null,是因为它在
attributes\u options
表中为null。这是有道理的,因为这些例子没有选择

为了解决这个问题,您应该从您希望条目存在的表中显式设置要选择的列。因此,不要选择*,而是尝试以下方法:

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;
下面是一个显示我的查询和你的查询的示例,因此你可以并排看到结果中的差异


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

您的查询应该返回所有活动以及关联的属性和选项。你确定没有WHERE子句吗?嗨@GordonLinoff,是的,我没有WHERE子句。这是一个JSON数组形式的返回对象粘贴。使用您提供的数据,您的预期结果是什么?@McAdam331我的预期结果将是这个,而不是前面提到的粘贴中的实际结果。我现在明白了。我已经给出了一个答案,我希望它是明确的。它像一个魅力工程!我实际上是这样开始的,但后来我想“见鬼,我只使用asterix,这样至少查询的这一部分不会把事情搞砸”。我错得再错不过了!而且,直到我看到SQL小提琴,我才知道这有什么不同。现在一切都清楚多了。多谢各位@没问题!我担心我不能用语言很好地表达出来,所以我很高兴视觉效果也有帮助。