选择数据:从具有不一致日期的多个表中分页数据

时间:2012-04-28 02:00:12

标签: mysql sql pagination

我有8个单独的表。每个表都有id,datetime字段和一些文本。

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

现在困难的部分 - 我需要为这个网站添加分页,所以在每个页面上我想要显示10天(除了最后一页,可能少于10个)。 每个表可能有不同的行数。

我一直在努力解决这个问题很长一段时间,但还没有找到一个优雅的解决方案。

这是一个例子(我将为这个例子选择两个表来简化它)。

TABLEA

4月1日| A1
4月5日| A2
4月7日| A3

tableB的

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,date(wc.changeTime)wcDate 来自diary_entry d 加入water_change wc 在d.aquariumId = wc.aquariumId 其中d.aquariumId = 2 按entryDate分组 按entryDate排序 限制10,5

所以,对于一个表我有这个查询: 选择日期(d.entryTime)entryDate 来自diary_entry d 其中d.aquariumId = 2 按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

和另一个: 选择日期(wc.changeTime)changeDate 来自water_change wc 其中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行

找到解决方案! (选择日期(d.entryTime)activityDate 来自diary_entry d 其中d.aquariumId = 1 按活动分组日期) 联盟 (选择日期(wc.changeTime)activityDate 来自water_change wc 其中wc.aquariumId = 1 按活动分组 按活动订购日期) 限制10,10

2 个答案:

答案 0 :(得分:1)

听起来你有选择和加入到位,只是错过了分页。如果是这种情况,您的脚本将必须跟踪您所在的页面,并且每次单击“下一页”都必须通过将此附加到您的SELECT查询来告诉MySQL从哪里返回接下来的10条记录:< / p>

SELECT ... JOIN ... WHERE ... ORDER BY ... LIMIT 20,10

将从完整记录集

中的第21行开始返回接下来的10行

答案 1 :(得分:1)

使用联盟查询。

SELECT TheDate,
       TheText
  FROM Table_A
 WHERE [your critera]
 UNION
SELECT TheDate,
       TheText
  FROM Table_B
 WHERE [your critera]
...

如果您只需要选择不同的那些,则可以按如下方式将其换行:

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