mysql组\u concat基于其他列的最大日期

irtuqstp  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(256)

我有输入表:

+-----+------------+---------------------+---------+-------------+
| 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\u 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  |
+------------+----------+-----------------------------------------+--------+

所以每个客户id有3列:程序,日期,多长时间
到目前为止,我已经在下面为programy和Nau ile专栏写了文章

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

但我不知道约会怎么办,所以一切都井然有序。在示例result中,我选择了一些对不同程序有多行的客户机,以最好地说明,正如您可以看到result中的日期是特定程序的最大日期。
为了让您更清楚地了解我要做的是处理我的输入表,以便能够计算不同程序的剩余订阅。
公式是:如果client\u id在订阅中没有记录,则使用clients表中的日期并返回该日期+1年和今天之间的差。如果客户机id在订阅中有记录,那么对于客户机在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查询和建议,如果我采取的方法是好的,或者可能有一些更简单的方法做它。
谢谢您

xj3cbfub

xj3cbfub1#

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

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 )
idfiyjo8

idfiyjo82#

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;

请参见SQLFiddle上的演示。

相关问题