【问题标题】:Select data: paginating data from multiple tables with inconsistent dates选择数据:对日期不一致的多个表中的数据进行分页
【发布时间】:2012-05-08 18:03:14
【问题描述】:

我有 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 日上午 1 日

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

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

--- p2 ---
4 月 5 日 b3
4 月 2 日 b2
4 月 2 日下午 1

--- p3 ---
4 月 1 日上午 1 日

问题是 - 我想不出一种优雅的方式来查询这些数据。这是我一直在搞乱的一些实时查询:

选择日期(d.entryTime)entryDate,日期(wc.changeTime)wcDate 来自日记条目 d 加入 water_change 厕所 在 d.aquariumId = wc.aquariumId 其中 d.aquariumId = 2 按条目日期分组 按 entryDate 排序 限制 10, 5

所以,对于一个表,我有这个查询: 选择日期(d.entryTime)entryDate 来自日记条目 d 其中 d.aquariumId = 2 按条目日期分组

它产生 13 个结果 入境日期 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 按更改时间分组

它产生 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)活动日期 来自日记条目 d 其中 d.aquariumId = 1 按活动日期分组) 联盟 (选择日期(wc.changeTime)活动日期 从 water_change wc 其中 wc.aquariumId = 1 按活动日期分组 按活动日期排序) 限制 10, 10

【问题讨论】:

  • 定义您的问题。是查询的问题吗?把数据送到前端?分页?我不知道从哪里开始帮助你。
  • 刚刚用一个例子和一些额外的注释编辑了原始问题。

标签: mysql sql pagination


【解决方案1】:

听起来您已经完成了选择和连接,只是缺少分页。如果是这种情况,您的脚本将必须跟踪您所在的页面,并且每次单击“下一页”都必须通过将其附加到您的 SELECT 查询来告诉 MySQL 从哪里返回接下来的 10 条记录:

SELECT...JOIN...WHERE...ORDER BY...限制 20、10

将从完整记录集中的第 21 行开始返回接下来的 10 行

【讨论】:

  • 实际上我也缺少选择和连接。例如,如何组合两个单独的日期列,是否必须是常规连接?现在如果我有 8 张桌子,那会不会有点太多了?而且分组可能会被取消。
  • 我刚刚用一组尝试了这个查询,看起来我不能这样做,语法不正确:select date(d.entryTime) activityDate from diary_entry d where d.aquariumId = 1 group by activityDate union select date(wc.changeTime) activityDate from water_change wc where wc.aquariumId = 1 group by activityDate order by activityDate limit 10, 10
  • 请不要介意,这只是我不是rtfming,我需要括号
  • np....新鲜的眼睛是让这些东西脱颖而出的原因,尽管这肯定从未发生在我身上(笑)
【解决方案2】:

使用联合查询它。

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]
...
);

【讨论】:

  • 我使用:select date(d.entryTime) activityDate from diary_entry d where d.aquariumId = 2 group by activityDate union select date(wc.changeTime) activityDate from water_change wc where wc.aquariumId = 2 group按activityDate 的顺序按activityDate 和它的工作原理!现在我只需要对其应用限制。这太不可思议了!
  • @tumanov,好吧……那行得通吗?您需要应用哪些“限制”?
  • @tumanov,我很高兴这对你有用。如果它解决了您的问题,请接受它作为解决方案。
  • 至于您的独特评论,我相信如果在我的情况下(查询已在原始问题中发布)它已经处理了重复项。
  • 不要打死马,但我不应该使用 group by 来将多个日期时间分组到一个日期中吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多