gpt4 book ai didi

mysql - 在同一查询中引用和计算数据

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

我有一个存储 Action 的表。有两种特殊类型的操作,例如,“起床”和“上床 sleep ”。

“起床”和“上床”之间的所有操作都应返回一个值为“AWAKE”的额外字段。如果 Action 发生在“起床”之前或“上床”之后,它应该返回一个值为“ASLEEP”的额外字段。 (这些只是示例值,尽量不要太认真。)

+--------+-----------+
| ac_id | ac_name |
+--------+-----------+
| 1 | Talk |
+--------+-----------+
| 2 | Wake Up |
+--------+-----------+
| 3 | Walk |
+--------+-----------+
| 4 | Go to bed |
+--------+-----------+
| 5 | Scream |
+--------+-----------+

使用此结构,如果我使用 SELECT ac_name, ac_status FROM actions_table WHERE ac_name = 'Walk' 进行查询,它应该返回:

ac_name: Walk
ac_status: AWAKE

...因为“走路”介于“起床”和“上床”之间。

我的问题是,如何在同一个查询中且不进行任何额外查询的情况下,根据行的“位置”返回该值?

可能我对 MySQL 的要求太高了,但如果我能做到,我想知道如何做到。如果这在单个查询中是不可能的,也接受 STORE PROCEDURES 或 FUNCTIONS。

编辑表格中可以有多个“Wake Up”和多个“Go to bed”。

最佳答案

你可以尝试这样的事情:

SELECT ac_name, 'AWAKE' as ac_status 
FROM actions_table
WHERE ac_id > (SELECT ac_id FROM actions_table WHERE ac_name = 'Wake Up') AND
ac_id < (SELECT ac_id FROM actions_table WHERE ac_name = 'Go to bed')
UNION
SELECT ac_name, 'ASLEEP' as ac_status
FROM actions_table
WHERE ac_id < (SELECT ac_id FROM actions_table WHERE ac_name = 'Wake Up') OR
ac_id > (SELECT ac_id FROM actions_table WHERE ac_name = 'Go to bed'

结果是:

ac_name  |  ac_status
_________|___________
Scream | ASLEEP
Talk | ASLEEP
Walk | AWAKE

编辑:

对于单个结果可能更多:

SELECT ac_name, 
CASE
WHEN ac_id > (SELECT ac_id FROM actions_table
WHERE ac_name = 'Wake Up') AND
ac_id < (SELECT ac_id FROM actions_table
WHERE ac_name = 'Go to bed')
THEN 'AWAKE'
WHEN ac_id < (SELECT ac_id FROM actions_table
WHERE ac_name = 'Wake Up') OR
ac_id > (SELECT ac_id FROM actions_table
WHERE ac_name = 'Go to bed')
THEN 'ASLEEP'
ELSE 'NO STATUS' END as ac_status
FROM actions_table
WHERE ac_name = 'Walk'

关于mysql - 在同一查询中引用和计算数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17863691/

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