Mysql 组_CONCAT选择中的条件
我有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 ------------------------------- 另外,我试过了,结果什么也没有返回Mysql 组_CONCAT选择中的条件,mysql,group-concat,Mysql,Group Concat,我有3个表,我将它们连接起来以获得一些数据 ----------------- Table Name: users ------------------------------- |user_id | user_name | ------------------------------- 123 | abc ------------------------------- 223 | bcd ------------------------------- 323 |
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`