2013-07-25 22 views
1

我有一個存儲操作的表。有兩種特殊的動作類型,比如說,「醒來」和「上牀睡覺」。在同一查詢中引用和計算數據

「醒來」和「睡覺」之間的所有動作應該返回一個額外字段,值爲「AWAKE」。如果動作在「醒來」之前或「睡覺」之後,它應該返回值爲「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太多的要求,但如果我可以這樣做,我想知道如何。 如果這在單個查詢中不可行,則也接受存儲過程或函數。

編輯 可以有多個「醒來」和超過一個「上牀睡覺」的表格。

回答

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' 
+0

非常感謝您的回答!我認爲應該是這樣。但是 - 我編輯了這個問題 - 可能有多個「喚醒」和多個「上牀」,因此對ac_id的引用可能會返回多個結果。無論如何,我會盡力發揮你的答案來解決問題。非常感謝你! – Unapedra

0

我的建議是創建一個具有字段ac_name和相應ac_name的表ac_status_master。然後你可以做一個簡單的連接來獲得想要的結果。

+--------+-----------+ 
| ac_name| ac_status | 
+--------+-----------+ 
| awake | Talk | 
+--------+-----------+ 
| awake | Wake Up | 
+--------+-----------+ 
| awake | Walk | 
+--------+-----------+ 
| asleep | Go to bed | 
+--------+-----------+ 
| asleep | Scream | 
+--------+-----------+ 
+0

感謝您的回答。這是一個有效的解決方案,但這裏的情況非常簡單。事實上,我希望能夠在我的真實案例中應用它,因爲數據庫結構非常複雜。按照你的建議做就意味着每次我改變一個動作位置(比方說,我想在「上牀睡覺」之後放一個「走路」),我將不得不更新所有相關的表格。不過,再次感謝您的回答! – Unapedra

相關問題