1

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

“Wake up”和“Go to bed”之间的所有操作都应返回一个值为“AWAKE”的额外字段。如果动作发生在“Wake up”之前或“Go to bed”之后,它应该返回一个值为“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

...因为“Walk”介于“Wake Up”和“Go to bed”之间。

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

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

编辑 表中可以有不止一个“Wake Up”和不止一个“Go to bed”。

4

2 回答 2

1

你可以尝试这样的事情:

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'
于 2013-07-25T16:43:05.653 回答
0

我的建议是创建一个表 ac_status_master,其中包含字段 ac_name 和相应的 ac_name。然后你可以做一个简单的连接来得到想要的结果。

+--------+-----------+
| ac_name| ac_status |
+--------+-----------+
| awake  |   Talk    |
+--------+-----------+
| awake  |  Wake Up  |
+--------+-----------+
| awake  |   Walk    |
+--------+-----------+
| asleep | Go to bed |
+--------+-----------+
| asleep |  Scream   |
+--------+-----------+
于 2013-07-26T10:20:58.777 回答