Mysql表使用where子句连接

时间:2014-07-07 23:09:14

标签: mysql

我正在尝试对数据库运行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'子句一起使用的查询中?

1 个答案:

答案 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