2012-12-05 42 views
2

可以說我有4個表A,B,C,D與記錄和datetime字段在每個表中。Mysql按日期排序,但篩選結果

目前我使用的是UNION ALLORDER BY Date DESC

問題是如果表A今天已添加10條記錄,並且表B有10條記錄昨天添加,則前10條結果全部來自表A

是否有可能獲得按日期排序的記錄,但將它們混合在所有4個表中?

第一條記錄將是表A中最新添加的,然後是表B,然後是C,然後是D的最新添加。像這樣循環它們?

感謝

回答

1

不幸的是,MySQL沒有排名功能 - 但可以用變量來模擬它。我建議您嘗試類似如下:

SELECT * FROM 
(select *, @rownum := @rownum + 1 AS rank, 'A' as tbl 
from (SELECT * FROM (SELECT A.* FROM A ORDER BY `date` desc) sa) a, 
     (SELECT @rownum := 0) r 
union all 
select *, @rownum2 := @rownum2 + 1 AS rank, 'B' as tbl 
from (select * from (SELECT B.* FROM B ORDER BY `date` desc) sb) b, 
     (SELECT @rownum2 := 0) r2 
union all 
select *, @rownum3 := @rownum3 + 1 AS rank, 'C' as tbl 
from (select * from (SELECT C.* FROM C ORDER BY `date` desc) sc) c, 
     (SELECT @rownum3 := 0) r3 
union all 
select *, @rownum4 := @rownum4 + 1 AS rank, 'D' as tbl 
from (select * from (SELECT D.* FROM D ORDER BY `date` desc) sd) d, 
     (SELECT @rownum4 := 0) r4 
) s 
order by rank, tbl 

或者,你可以試試:

SELECT * FROM 
(SELECT S.*, 
     @rownum := CASE WHEN @tblvar <> S.tbl THEN 0 ELSE @rownum+1 END AS rank, 
     @tblvar := S.tbl AS tblvar 
FROM 
(SELECT * FROM 
    (SELECT A.*, 'A' as tbl FROM A 
    UNION ALL 
    SELECT B.*, 'B' as tbl FROM B 
    UNION ALL 
    SELECT C.*, 'C' as tbl FROM C 
    UNION ALL 
    SELECT D.*, 'D' as tbl FROM D) U 
    ORDER BY tbl, `date` desc) S, 
(SELECT @rownum := 0) R, 
(SELECT @tblvar := '!') T 
) Q 
order by rank, tbl 
+0

num代表什麼?它給了我像沒有這樣的字段的錯誤 – galgai

+0

好吧,我試過這個,把num改成*。老實說,我不知道這是什麼,這麼多子查詢,但顯然這是工作,並沒有那麼慢。你是天才,謝謝! – galgai

+0

daaaaaaamn,在我的本地機器上工作正常,但是它在引發的活動服務器上:mysqld-5.0.67-community-nt-log]選擇的嵌套層級太高。好吧。 – galgai

1

我不知道這是你在找什麼,但我認爲你可以使用這樣的事情:

SELECT 
    A.*, 
    datediff((select max(`date`) from A), `date`) as d_diff, 
    1 as tab 
FROM A 
UNION ALL 
SELECT 
    B.*, 
    datediff((select max(`date`) from B), `date`) as d_diff, 
    2 as tab 
FROM B 
ORDER BY d_diff, tab, `date` desc 

也許這樣的:

SELECT * FROM (SELECT A.* FROM A ORDER BY `date` desc limit 5) a 
UNION ALL 
SELECT * FROM (SELECT B.* FROM B ORDER BY `date` desc limit 5) b 
ORDER BY `date` DESC 

基於在您的意見,這應該工作,但也可能是緩慢的:

SELECT 
    A.*, 
    (select count(*) from A A1 where A1.dat>A.dat) as i, 
    1 as tab 
FROM A 
UNION ALL 
SELECT 
    B.*, 
    (select count(*) from B B1 where B1.dat>B.dat) as i, 
    2 as tab 
FROM B 
order by i, tab 

(使用變量可以使速度更快,但我更喜歡純SQL)

+0

試了一下,現在,它幾乎同樣的事情,只是按日期順序 - 剛剛從一個拉10條記錄直表。 – galgai

+0

@galgai這兩個查詢返回從所有表混合的記錄,我會編輯我的第一個讓它像你想要的循環...讓我知道,但我認爲它應該沒問題.... – fthiella

+0

@galgai日期有空隙?也許這就是問題......但我正在考慮這個問題...... – fthiella