2

A,B,C,D各テーブルにレコードとdatetimeフィールドを持つ 4 つのテーブルがあるとします。

現在、私は と を使用UNION ALLしてORDER BY Date DESCいます。

問題は、テーブルAに今日追加された 10 個のレコードがあり、テーブルBに昨日追加された 10 個のレコードがある場合、最初の 10 個の結果はすべて table からのものAです。

日付順にレコードを取得することは可能ですが、4 つのテーブルすべてでそれらを混在させることはできますか?

最初のレコードは table から追加された最新のレコード、次に table から追加された最新のレコード、A次にです。そして、それらをそのように循環させますか?BCD

ありがとう

4

2 に答える 2

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
于 2012-12-05T20:32:48.963 に答える
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 の方が好きです)

于 2012-12-05T20:14:19.680 に答える