我正在尝试对数据库运行MySQL查询并将3个表连接在一起。
我在数据库中有3个表;
包含重要数据的表
+----+-------+----------------------+
| id | name | value |
+----+-------+----------------------+
| 1 | data1 | First piece of data |
| 2 | data2 | Second piece of data |
| 3 | data3 | Third piece of data |
+----+-------+----------------------+
包含flag_id到flag_name的表
+----+-------+-------------+
| id | name | description |
+----+-------+-------------+
| 1 | flag1 | NULL |
| 2 | flag2 | NULL |
| 3 | flag3 | NULL |
| 4 | flag4 | NULL |
+----+-------+-------------+
包含要标记映射的一对多数据的表
+----+---------+--------+---------+
| id | type_id | status | data_id |
+----+---------+--------+---------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 0 | 1 |
| 3 | 4 | 1 | 1 |
| 4 | 2 | 0 | 2 |
| 5 | 3 | 0 | 2 |
| 6 | 4 | 1 | 2 |
| 7 | 3 | 0 | 3 |
| 8 | 4 | 1 | 3 |
+----+---------+--------+---------+
我希望能够有一个查询,它会将每个命名标志显示为每个数据的列。在搜索网络时,我找到了一个使用此查询的示例:
select d.id, d.name, d.value,
MAX(CASE WHEN f.type_id = 1 THEN f.status ELSE NULL END) as flag1,
MAX(CASE WHEN f.type_id = 2 THEN f.status ELSE NULL END) as flag2,
MAX(CASE WHEN f.type_id = 3 THEN f.status ELSE NULL END) as flag3,
MAX(CASE WHEN f.type_id = 4 THEN f.status ELSE NULL END) as flag4
from data d
inner join flags f on f.data_id = d.id
group by d.id
这给出了我想要的结果。
+----+-------+----------------------+-------+-------+-------+-------+
| id | name | value | flag1 | flag2 | flag3 | flag4 |
+----+-------+----------------------+-------+-------+-------+-------+
| 1 | data1 | First piece of data | 0 | 0 | NULL | 1 |
| 2 | data2 | Second piece of data | NULL | 0 | 0 | 1 |
| 3 | data3 | Third piece of data | NULL | NULL | 0 | 1 |
+----+-------+----------------------+-------+-------+-------+-------+
问题是我需要添加一个where子句来过滤特定的标志,但是我得到'flag4'是一个Unknown列的错误,这是因为别名不能用在where子句中。
如何实现这一点,最好是在一个可以与'where'子句一起使用的查询中?
答案 0 :(得分:1)
使用where
。
having
flag
列是聚合操作的结果,因此,如果要对它们应用选择条件,则必须使用。例如:
select d.id, d.name, d.value,
MAX(CASE WHEN f.type_id = 1 THEN f.status ELSE NULL END) as flag1,
MAX(CASE WHEN f.type_id = 2 THEN f.status ELSE NULL END) as flag2,
MAX(CASE WHEN f.type_id = 3 THEN f.status ELSE NULL END) as flag3,
MAX(CASE WHEN f.type_id = 4 THEN f.status ELSE NULL END) as flag4
from data d
inner join flags f on f.data_id = d.id
group by d.id
havig flag1 = 0