【问题标题】:mySQL group_concat max dates based on other column基于其他列的 mySQL group_concat 最大日期
【发布时间】:2018-11-19 17:19:22
【问题描述】:

我有输入表:

+-----+------------+---------------------+---------+-------------+
| id  | client_id  | subscription_date   | program |how_long_subs|
+-----+------------+---------------------+---------+-------------+
|   1 |          1 | 2016-05-20 00:00:00 | W90     |          12 |
|   2 |          4 | 2017-01-01 00:00:00 | W90     |           6 |
| 314 |          7 | 2017-03-21 00:00:00 | AB      |          12 |
|   3 |          8 | 2016-12-19 00:00:00 | W90     |          12 |
|   4 |          9 | 2018-06-08 00:00:00 | W90     |          12 |
|   5 |         10 | 2017-06-12 00:00:00 | W90     |          12 |
| 313 |         10 | 2017-01-18 00:00:00 | AB      |          12 |
| 377 |         11 | 2018-12-22 00:00:00 | AB      |          12 |
| 308 |         11 | 2017-12-22 00:00:00 | AB      |          12 |
|   6 |         11 | 2017-12-22 00:00:00 | W90     |          12 |
|   7 |         13 | 2017-01-05 00:00:00 | W90     |           6 |
|   8 |         21 | 2017-03-10 00:00:00 | W90     |          12 |
| 325 |         22 | 2017-03-02 00:00:00 | AB      |           1 |
+-----+------------+---------------------+---------+-------------+

id 是此表的唯一自增列 client_id 用于连接 clients 表。我正在寻找以下形式的结果:

+------------+----------+-----------------------------------------+--------+
| client_id  | programs |                  dates                  |how_long|
+------------+----------+-----------------------------------------+--------+
|          1 | W90      |  2016-05-20 00:00:00                    | 12     |
|        ... |          |                                         |        |
|         11 | W90|AB   | 2017-12-22 00:00:00|2018-12-22 00:00:00 | 12|12  |
+------------+----------+-----------------------------------------+--------+

所以每个 client_id 都有 3 列:programs、dates、how_long

到目前为止,我在下面列出了 programy 和 na_ile

SELECT
  client_id,
  GROUP_CONCAT(DISTINCT program SEPARATOR '|') AS programs
FROM subscriptions GROUP BY client_id

但我不知道如何为日期执行此操作,所以一切都井井有条。 在示例结果中,我为不同的程序选择了具有多行的一些客户端,以最好地说明,因为您可以看到结果中的日期是某些程序的 MAX 日期。

为了让您更好地了解我正在尝试做的是处理我的输入表,以便能够计算不同程序的剩余订阅。

公式为: 如果 client_id 在订阅中没有记录,则使用客户表中的日期 并返回该日期 +1 年与今天之间的差异。 如果 client_id 有订阅记录,那么 对于每个独特的程序客户在 subs 表中: 获取该最大日期/程序的最大订阅日期和相应的how_long_subs。将 how_long_subs 月添加到订阅日期,并以天为单位返回与现在的差额。

我的计划是如上所述获取结果表并使用 php 处理行以获得如下内容:

example result for client_id: 11
W90: 2017-12-22 00:00:00 +12 months - now()
AB: 2018-12-22 00:00:00 +12 months - now()

如果我采取的方法可以,或者可能有一些更简单的方法,你能帮我查询一下 mySQL 并提供建议吗?

谢谢

【问题讨论】:

  • 你提到了 php,所以我会在那里做

标签: php mysql aggregate-functions


【解决方案1】:

您可以使用子查询来获取最大日期

SELECT client_id, GROUP_CONCAT( program SEPARATOR '|') programs, 
       GROUP_CONCAT(max_date SEPARATOR '|') max_date
FROM (
SELECT
  client_id,
  programs,
  max(subscription_date) max_date
FROM subscriptions
GROUP BY client_id, program ) 

【讨论】:

  • 我得到的结果是这样的:1 W90|W90|AB|W90|W90|AB|W90|AB|W90|W90|W90|AB|W90|W9... 2016 -05-20 00:00:00|2017-01-01 00:00:00|2017-03-21...
【解决方案2】:
SELECT A.client_id, 
GROUP_CONCAT(DISTINCT A.program SEPARATOR '|') programs,
GROUP_CONCAT(DISTINCT A.subscription_date SEPARATOR '|') dates,
GROUP_CONCAT(A.how_long_subs SEPARATOR '|') how_long   
FROM 
(SELECT client_id, subscription_date, MAX(program) program, how_long_subs
FROM subscriptions
GROUP BY client_id, subscription_date,how_long_subs) A
GROUP BY A.client_id;

DEMO on SQL Fiddle

【讨论】:

  • 非常感谢!!!你能评论一下我计算剩余订阅量的方法吗,我觉得有更好的方法我只是没有看到它。
  • 您应该用一些样本和预期数据将其作为单独的问题提出。
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多