[英]Condition in GROUP_CONCAT selection
I have 3 tables and I'm joining them to get some data.我有 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 -------------------------------
I need to get a result like this.我需要得到这样的结果。 I am stuck with the GROUP_CONCAT for the dates column.
我坚持使用 GROUP_CONCAT 作为日期列。 The date column should have all entries other than the MAX date.
日期列应包含除 MAX 日期之外的所有条目。 If there is only one entry in the
limit_setting
table for that limit_id then it shouldn't show anything for that user.如果该
limit_setting
表中只有一个条目,那么它不应该为该用户显示任何内容。 count_dates
: its the number of entries which are there in the limit_setting
table. 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
Additionally i tried with (which returned nothing)另外我试过(没有返回任何东西)
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
I tried with Find_in_set
but not sure how to use it effectively.我尝试使用
Find_in_set
但不确定如何有效地使用它。
Try this:尝试这个:
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
The query uses SUBSTRING_INDEX
function in order to get all dates returned by GROUP_CONCAT
except from the last date.该查询使用
SUBSTRING_INDEX
函数来获取GROUP_CONCAT
返回的所有日期,除了最后一个日期。 Using ORDER BY
inside GROUP_CONCAT
we can place the maximum date at the end, so that SUBSTRING_INDEX
truncates exactly this date.在
GROUP_CONCAT
使用ORDER BY
我们可以将最大日期放在最后,以便SUBSTRING_INDEX
截断这个日期。
I would use a subquery to return the max date per limit and join this back to the limit setting table to eliminate the maximum dates from the group_concat()
with a case
expression:我将使用子查询返回每个限制的最大日期并将其连接回限制设置表,以使用
case
表达式从group_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`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.