选择数据:对日期不一致的多个表中的数据进行分页

tum*_*nov 3 mysql sql pagination

我有8张独立的桌子。每个表都有 ID、日期时间字段和一些文本。

我在时间线视图中的单个页面上呈现所有表组合的数据,最新条目位于顶部,每个表中的条目都混合在此时间线中。

现在最困难的部分是 - 我需要向该网站添加分页,因此在每个页面上我想精确显示 10 天(最后一页除外,可能少于 10 天)。每个表的行数可能不同。

我已经为此苦苦挣扎了一段时间,但尚未想出一个优雅的解决方案。

这是一个示例(我将仅为此示例选择两个表以使其更简单)。

表A

4 月 1 日 | a1
4 月 5 日 | a2
4 月 7 日 | a3

表B

4 月 2 日 | b1
4 月 2 日 | b2
4 月 5 日 | b3
4 月 6 日 | b4

全球时间线看起来像这样


4月7日 a3
4月6日 b4
4月5日
a2 4月5日 b3
4月2日 b2
4月2日 b1
4月1日 a1

如果每个页面只显示 3 天,我需要它看起来像这样:

--- p1 ---
4月7日a3
4月6日b4
4月5日a2

--- p2 ---
4月5日 b3
4月2日 b2
4月2日 b1

--- p3 ---
4 月 1 日 a1

问题是 - 我无法找到一种以优雅的方式查询这些数据的方法。这是我一直在搞乱的一些实时查询:

选择日期(d.entryTime)entryDate,日期(wc.changeTime)wcDate from diary_entry d join water_change wc on d.aquariumId = wc.aquariumId where d.aquariumId = 2 按entryDate分组 按entryDate限制 10, 5

因此,对于一张表,我有以下查询: select date(d.entryTime) entryDate from diary_entry d where d.aquariumId = 2 group by entryDate

它产生13个结果entryDate 2012-01-13
2012-01-14
2012-01-25
2012-01-26
2012-01-31
2012-02-04
2012-02-17
2012-02-20
2012-02-25
2012-03-17
2012-03-31
2012-04-01
2012-04-06

另一个: select date(wc.changeTime) changeDate from water_change wc where wc.aquariumId = 2 group by changeTime

它产生 8 个结果 2012-01-22
2012-01-26
2012-02-17
2012-02-25
2012-03-04
2012-03-10
2012-04-04
2012-04-24

两者之间共有三个共同日 2012-01-26 2012-02-17 2012-02-25

因此,我需要生成的查询必须有 13 + 8 - 3 行 = 18 行

并且找到了解决方案!(从 diary_entry d 选择日期(d.entryTime)activityDate,其中 d.aquariumId = 1 按 ActivityDate 分组) union(从 water_change wc 选择日期(wc.changeTime)activityDate,其中 wc.aquariumId = 1 按 ActivityDate 分组 按 ActivityDate 排序)限制 10 , 10

Mar*_*arc 5

使用 Union 对其进行查询。

SELECT TheDate,
       TheText
  FROM Table_A
 WHERE [your critera]
 UNION
SELECT TheDate,
       TheText
  FROM Table_B
 WHERE [your critera]
...
Run Code Online (Sandbox Code Playgroud)

如果您只需要选择不同的,则可以按如下方式包装:

Select Distinct
       TheDate,
       TheText
  From 
(
 SELECT TheDate,
       TheText
  FROM Table_A
 WHERE [your critera]
 UNION
SELECT TheDate,
       TheText
  FROM Table_B
 WHERE [your critera]
...
);
Run Code Online (Sandbox Code Playgroud)