残念ながら、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