【问题标题】:Get groups of object ids with datetime grouped by date获取具有按日期分组的日期时间的对象 ID 组
【发布时间】:2020-01-20 09:12:58
【问题描述】:

假设我们有这样的表:

+----------------------------------+----------------------------+
| id                               | start                      |
+----------------------------------+----------------------------+
| 06c561305383482e98064ssdfd6ccf74 | 2019-08-30 14:41:40.697301 |
| 0aec07d9acdd48c485ab3sfhsffdsa8c | 2019-09-02 05:45:09.274541 |
| 0d240asdfasd49579e2be8821b908fdc | 2019-09-02 05:45:08.745885 |
| 00al4eebb9a34sdsdfsdff128518dc4f | 2019-08-30 14:42:29.094314 |

是否可以在单个查询中获取与此结构类似的数据? 我想获取按日期组中所有对象 ID 的唯一日期分组的数据。

date:
    2019-08-30:
       ids: 
           - 06c561305383482e98064ssdfd6ccf74 
           - 00al4eebb9a34sdsdfsdff128518dc4f
    2019-09-02:
       ids: 
           - 0aec07d9acdd48c485ab3sfhsffdsa8c
           - 0d240asdfasd49579e2be8821b908fdc

【问题讨论】:

  • GROUP_CONCAT(id) ... GROUP BY date(`start`)?
  • 是否涉及其他编程语言(如 PHP),因为您的预期结果看起来像您想要发送到应用程序的显示格式或“伪 JSON”格式?
  • 另外,如果您遵循@SalmanA 的建议,这很可能是正确的,请不要忘记运行SET SESSION group_concat_max_len = @@max_allowed_packet;,否则您将达到 1024 字符长度最大值,GROUP_CONCAT 会静默截断而不会出现错误

标签: mysql mariadb


【解决方案1】:

感谢@Salaman

SELECT DATE(tab.start), GROUP_CONCAT(id) FROM tab GROUP BY DATE(tab.start);

像魅力一样工作!

还记得设置:

SET SESSION group_concat_max_len = @@max_allowed_packet;

【讨论】:

  • 它仍然可能失败GROUP_CONCAT max char lenght is 1024 你需要在查询之前运行SET SESSION group_concat_max_len = @@max_allowed_packet;..
  • @RaymondNijland - 这可能有风险,特别是如果您将 max_allowed_packet 设置为较大的值。
  • “这可能有风险,.. 将 max_allowed_pa​​cket 设置为一个很大的值。” @RickJames 为什么?正如手册中所说的 max_allowed_pa​​cket “增加此变量的值是安全的,因为仅在需要时才分配额外的内存。”意思是 group_concat_max_len 自动安全地扩展它至少这是我根据手动信息假设的......我并没有真正看到关于你的警告的意义,也许当你有非常大的组(以百万计)被字符串连接时它可能会成为一个问题,那么无论如何你会使用GROUP_CONCAT(..) 吗? ..
  • @RaymondNijland - 我希望你是对的。但我持怀疑态度。我从未听说过 MySQL 会避免分配会导致 swapping 的内存的任何情况。另外,我想知道它是如何分配 group_concat 空间的——1KB,然后是 2KB,然后是 4KB,等等,直到它有足够的空间,或者达到限制?我希望它能做到这一点,而不是盲目地分配最大值。我认为net_buffer_length 成长为max_allowed_packet。而且似乎其他东西过去总是以最大值分配,但后来“按需增长”。
  • @RaymondNijland - 找到它...从 5.6.4 开始,sort_buffer_size 会根据需要增长,而不是分配给给定的设置。
猜你喜欢
  • 2016-09-06
  • 2022-01-18
  • 1970-01-01
  • 2015-09-08
  • 2020-12-04
  • 2023-03-25
  • 1970-01-01
  • 2020-09-09
  • 2012-09-26
相关资源
最近更新 更多