我有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 -------------------------------
我需要得到这样的结果。我坚持使用GROUP_CONCAT作为日期列。
日期列应包含除MAX日期之外的所有条目。如果{limit}的limit_setting
表中只有一个条目,那么它不应该为该用户显示任何内容。
count_dates
:limit_setting
表中的条目数。
Desired output ---------------------------------------------------------------------- user_name | dates | count_dates ---------------------------------------------------------------------- abc | 2016-09-27 12:00:00 , 2016-09-24 12:00:00 | 3 ---------------------------------------------------------------------- bcd | | 1 ---------------------------------------------------------------------- cde | | 1 ----------------------------------------------------------------------- cde | 2016-09-26 12:00:00 | 2 -----------------------------------------------------------------------
SELECT 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
另外我试过(没有返回)
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
我尝试使用Find_in_set
,但不确定如何有效地使用它。
答案 0 :(得分:1)
试试这个:
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
该查询使用SUBSTRING_INDEX
函数来获取GROUP_CONCAT
返回的所有日期,但的最后日期除外。在ORDER BY
内使用GROUP_CONCAT
,我们可以将最大日期放在最后,以便SUBSTRING_INDEX
完全截断此日期。
答案 1 :(得分:0)
我会使用子查询返回每个限制的最大日期,并将其重新连接到限制设置表,以消除group_concat()
case
表达式的最大日期:
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`