mysql - 无法通过多个连接获取正确的数据

标签 mysql database relational-database join

我有下表和示例数据:

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?

最佳答案

您看到 attribute_id 为 null 的原因是它在 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;

这是一个SQL Fiddle显示我的查询和您的查询的示例,以便您可以并排看到结果的差异。

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

关于mysql - 无法通过多个连接获取正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30803461/

相关文章:

php - CodeIgniter - MySQL 错误 1064(更新 table1 内连接 table2(...))

javascript - 如何连接 Bookshelf.js 中的三个表?

database - 连续数据库备份?

mysql - 关系中字段类型的逻辑

php - 什么会更好 : click counter on mysql or on flat file?

mysql - 如何将一行链接到另一表上的一行?

sql - 按天分组,在left join中显示没有数据和复杂查询的天数

hadoop - 使用ES存储大数据并创建即时搜索的最佳方法是什么?

mysql - 难以掌握 MySQL 的函数依赖概念

php - 当关系数据库中的 A 列相同时,如何对 B 列求和