gpt4 book ai didi

Mysql 表连接使用 where 子句

转载 作者:行者123 更新时间:2023-11-29 03:00:24 25 4
gpt4 key购买 nike

我正在尝试对数据库运行 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”是一个未知列,这是因为不能在 where 子句中使用别名。

如何实现这一点,最好是在可以与“where”子句一起使用的单个查询中?

最佳答案

不要使用where,而是使用having

flag 列是聚合操作的结果,因此,如果要对它们应用选择标准,则必须使用 having。示例:

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

关于Mysql 表连接使用 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24621356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com