Mysql 组_CONCAT选择中的条件

Mysql 组_CONCAT选择中的条件,mysql,group-concat,Mysql,Group Concat,我有3个表,我将它们连接起来以获得一些数据 ----------------- Table Name: users ------------------------------- |user_id | user_name | ------------------------------- 123 | abc ------------------------------- 223 | bcd ------------------------------- 323 |

我有3个表,我将它们连接起来以获得一些数据

----------------- Table Name: users ------------------------------- |user_id | user_name | ------------------------------- 123 | abc ------------------------------- 223 | bcd ------------------------------- 323 | cde ------------------------------- ----------------- Table Name: limit ------------------------------- user_id | limit_id ------------------------------- 123 | 1 ------------------------------- 223 | 2 ------------------------------- 323 | 3 ------------------------------- 323 | 4 ------------------------------- ------------------------- Table Name: limit_setting ------------------------------- limit_id | date_limit ------------------------------- 1 | 2016-09-29 12:00:00 ------------------------------- 2 | 2016-09-28 12:00:00 ------------------------------- 3 | 2016-09-27 12:00:00 ------------------------------- 1 | 2016-09-27 12:00:00 ------------------------------- 1 | 2016-09-24 12:00:00 ------------------------------- 4 | 2016-09-25 12:00:00 ------------------------------- 4 | 2016-09-26 12:00:00 ------------------------------- 另外,我试过了,结果什么也没有返回

SELECT ESL.date_limit, MAX(date_limit) as max_date, PP.`user_name`, count(ESL.Limit_id) as count_dates, 
  GROUP_CONCAT(ESL.date_limit SEPARATOR ',') as dates 
FROM users as PP INNER JOIN `limit` as PAL ON PP.Id = PAL.PlayerId 
LEFT JOIN limit_setting as ESL ON ESL.LimitId = PAL.limitId 
GROUP BY PAL.limitId
HAVING ESL.date_limit > max_date
我尝试了在集合中查找,但不确定如何有效地使用它。

尝试以下方法:

SELECT user_name,        
       CASE WHEN COUNT(*) > 1 
            THEN SUBSTRING_INDEX(GROUP_CONCAT(date_limit ORDER BY date_limit), 
                                 ',', COUNT(*) - 1) 
            ELSE ''
       END AS dates,             
       COUNT(*) AS count_dates
FROM users as PP 
INNER JOIN `limit` as PAL ON PP.user_id = PAL.user_id
LEFT JOIN limit_setting as ESL ON ESL.limit_id = PAL.limit_id
GROUP BY user_name
该查询使用函数获取组_CONCAT返回的所有日期,但最后一个日期除外。使用GROUP_CONCAT中的ORDER BY,我们可以将最大日期放在末尾,这样子字符串_索引正好截断该日期


我将使用子查询返回每个限额的最大日期,并将其连接回限额设置表,以使用一个case表达式消除组_concat中的最大日期:

SELECT 
    PP.`user_name`,
    count(ESL.Limit_id) as count_dates,
    GROUP_CONCAT(CASE
                     WHEN ESL.date_limit<>ls.maxdate THEN ESL.date_limit
                     ELSE ''
                 END SEPARATOR ',') as dates 
FROM users as PP
INNER JOIN `limit` as PAL ON PP.Id = PAL.PlayerId
LEFT JOIN limit_setting as ESL ON ESL.LimitId = PAL.limitId
LEFT JOIN (SELECT LimitId, MAX(date_limit) as maxdate
           FROM limit_setting
           GROUP BY LimitId
          ) ls ON ESL.LimitId=ls.LimitId
GROUP BY PP.`user_name`

非常感谢你的帮助和解释。。。我以前从未使用过子字符串索引,也不知道。。。再次感谢:我也得到了这个结果,但是在dates字段的开头有一个“,”。。。像这样:,2016-09-23 00:00:002016-09-21 00:00:002016-09-2。。
SELECT user_name,        
       CASE WHEN COUNT(*) > 1 
            THEN SUBSTRING_INDEX(GROUP_CONCAT(date_limit ORDER BY date_limit), 
                                 ',', COUNT(*) - 1) 
            ELSE ''
       END AS dates,             
       COUNT(*) AS count_dates
FROM users as PP 
INNER JOIN `limit` as PAL ON PP.user_id = PAL.user_id
LEFT JOIN limit_setting as ESL ON ESL.limit_id = PAL.limit_id
GROUP BY user_name
SELECT 
    PP.`user_name`,
    count(ESL.Limit_id) as count_dates,
    GROUP_CONCAT(CASE
                     WHEN ESL.date_limit<>ls.maxdate THEN ESL.date_limit
                     ELSE ''
                 END SEPARATOR ',') as dates 
FROM users as PP
INNER JOIN `limit` as PAL ON PP.Id = PAL.PlayerId
LEFT JOIN limit_setting as ESL ON ESL.LimitId = PAL.limitId
LEFT JOIN (SELECT LimitId, MAX(date_limit) as maxdate
           FROM limit_setting
           GROUP BY LimitId
          ) ls ON ESL.LimitId=ls.LimitId
GROUP BY PP.`user_name`