2012-12-31 35 views
2

我有一張表,其中列的等級從(a到f)不等。查詢多個列和日期

date  gr1 gr2 gr3 
2012-1-1 a b c 
2011-11-31 b d c 
2011-11-30 c a f 
2011-11-29 a b f 
2011-11-28 f b c 
2011-11-27 a c d 
2011-11-26 c a b 

我需要查詢如下: 我當任何一個字段的值必須選擇一個「A」,然後在第二天的「F」級,無論哪個列有檔次。

我是新手,任何幫助將不勝感激......新年快樂!

+1

你如何期待結果?你試過了什麼? –

+0

這些數據庫將運行? –

+0

使用MySQL ....所有我想要的是運行查詢,並讓它顯示4列。 –

回答

1

進行比較時,一種方法是將記錄一起比較到同一行中。由於您想比較「當前日期到下一天」的記錄,因此您可以將自己的表格加入日期中一天的差異。這是通過DATEDIFF函數完成的,該函數計算兩個日期之間不同的天數。

查詢1

select 
    today.*, 
    followingday.date as ndate, followingday.gr1 as ngr1, 
    followingday.gr2 as ngr2, followingday.gr3 as ngr3 
from mytable today 
join mytable followingday on DATEDIFF(followingday.date, today.date) = 1 

這會給下面的結果,在連續一天的值與前一日合併(我用的n前綴更名爲列從followingday,使所有的列具有唯一的名稱,否則他們不會全部顯示在結果集):

結果(DEMO

|       DATE | GR1 | GR2 | GR3 |       NDATE | NGR1 | NGR2 | NGR3 | 
------------------------------------------------------------------------------------------------------------ 
| November, 30 2011 00:00:00+0000 | c | a | f | December, 01 2011 00:00:00+0000 | b | d | c | 
| November, 29 2011 00:00:00+0000 | a | b | f | November, 30 2011 00:00:00+0000 | c | a | f | 
| November, 28 2011 00:00:00+0000 | f | b | c | November, 29 2011 00:00:00+0000 | a | b | f | 
| November, 27 2011 00:00:00+0000 | a | c | d | November, 28 2011 00:00:00+0000 | f | b | c | 
| November, 26 2011 00:00:00+0000 | c | a | b | November, 27 2011 00:00:00+0000 | a | c | d | 

既然結果組合成一行,我們就可以將一些邏輯應用到數據中。在這種情況下,規則是「任何欄值在第二天都有一個'a',後面跟着'f'等級,不管哪一欄有分數。」因此,任何的等級是一個a在當天,隨後任何牌號翌日作爲一個f的:

查詢2

... 
where (today.gr1 = 'a' or today.gr2 = 'a' or today.gr3 = 'a') 
    and (followingday.gr1 = 'f' or followingday.gr2 = 'f' or 
     followingday.gr3 = 'f') 

結果(DEMO

|       DATE | GR1 | GR2 | GR3 |       NDATE | NGR1 | NGR2 | NGR3 | 
------------------------------------------------------------------------------------------------------------ 
| November, 29 2011 00:00:00+0000 | a | b | f | November, 30 2011 00:00:00+0000 | c | a | f | 
| November, 27 2011 00:00:00+0000 | a | c | d | November, 28 2011 00:00:00+0000 | f | b | c | 

結果表明,有的a11-27-11一個檔次,其次在11-28-11上的等級爲f。同樣,在11-29-11上有a的等級,然後11-30-11上的等級爲f。這些應該是滿足規則的唯一結果。

+0

哇...非常感謝您的快速回復......如果只有我們的政治家會一樣有效...... LOL –

+0

哇......非常感謝您的快速回復......如果只我們的政治家會同樣有效... LOL查詢2是我一直在尋找的。但在Query1中,不需要顯示Dec 1結果,因爲當天沒有'f'等級。但是,您的幫助非常感謝! –

+0

@NJPLima:我只是一步一步展示我的思維過程。第一個查詢只是將兩天連接在一起,沒有過濾。第二個查詢則基於業務邏輯規則添加過濾來構建。這也不是唯一的方法 - 您可以使用'exists'子句檢查第二天與f級匹配的行,對於每個具有a級的行。 – mellamokb