mysql - 如何在父查询案例语句中使用子查询的结果
问题描述
我有以下查询返回预期结果:
SELECT
locations.*,
(
SELECT
id
FROM
hauls
WHERE
haul_type_id = 1
AND location_id = locations.id
ORDER BY
created_at DESC
LIMIT 1) AS last_delivery_id,
(
SELECT
id
FROM
hauls
WHERE
haul_type_id = 2
AND location_id = locations.id
ORDER BY
created_at DESC
LIMIT 1) AS last_pickup_id
FROM
locations
我想在父查询的 case 语句中使用子查询 ( last_delivery_id
, ) 的结果,但出现错误:last_pickup_id
错误:未知列“last_delivery_id”
SELECT
locations.*,
case when last_delivery_id = 1 then 'pending' when last_delivery_id = 2 then 'active' end as status,
(
SELECT
id
FROM
hauls
WHERE
haul_type_id = 1
AND location_id = locations.id
ORDER BY
created_at DESC
LIMIT 1) AS last_delivery_id,
(
SELECT
id
FROM
hauls
WHERE
haul_type_id = 2
AND location_id = locations.id
ORDER BY
created_at DESC
LIMIT 1) AS last_pickup_id
FROM
locations
解决方案
您可以使用子查询或 CTE:
SELECT lh.*, . . . -- any expressions you want
(case when last_delivery_id = 1 then 'pending'
when last_delivery_id = 2 then 'active'
end) as status
FROM (SELECT l.*,
(SELECT id
FROM hauls h
WHERE h.haul_type_id = 1 AND
h.location_id = l.id
ORDER BY h.h.created_at DESC
LIMIT 1
) AS last_delivery_id,
(SELECT id
FROM hauls h
WHERE h.haul_type_id = 2 AND
h.location_id = l.id
ORDER BY h.created_at DESC
LIMIT 1
) AS last_pickup_id
FROM locations l
) lh
请注意表别名的使用,这使查询更易于编写和阅读。delivery_id
也就是说,如果您只想要字符串版本,我不确定您是否真的需要:
SELECT l.*,
(SELECT (case when h.id = 1 then 'pending'
when h.id = 2 then 'active'
end)
FROM hauls h
WHERE h.haul_type_id = 1 AND
h.location_id = l.id
ORDER BY h.created_at DESC
LIMIT 1
) AS status
FROM locations l
推荐阅读
- wso2 - 端点[状态:暂停]
- c# - XML 未正确序列化为对象
- html - 屏幕尺寸过小时文本重叠
- kendo-ui - Kendo Window - 使用自定义更新
- react-native - store.dispatch 不是一个函数 - 将原生 redux-persist 与 redux-thunk middlware 反应
- php - 添加 if user is guest/customer 语句到 PHP
- amazon-web-services - 适用于 Amazon Redshift 的 JDBC 驱动程序与 Python 适配器之间的区别
- telegraf - 像 [[inputs.mem]] 这样的电报输入插件如何获取数据?
- scala - 如何使用 Spark 比较两个表的列?
- amazon-web-services - 与默认 VPC 创建相关的 IAM 策略