[英]MySQL GROUP CONCAT duplicates
我有一个结果表,看起来像这样:
score_id, uid, af_id, level, record_date
其中uid
是系统上用户的用户ID。 af_id
是已设置级别的焦点。 af_id
将为1.1、1.2、1.3。 Level
是一个整数值,范围是3-7。
样本数据集为:
1, 2, 1.1, 4, 2012-09-02
2, 2, 1.2, 4, 2012-09-02
3, 2, 1.3, 3, 2012-09-02
4, 2, 1.3, 4, 2012-11-30
我需要查询数据库以收集用户在特定日期之间对于每个af_id
达到的级别。 我正在使用GROUP_CONCAT
将数据放入一行。 我的查询在第一个时间段有效,但此后会产生重复。 到目前为止,我的SQL是:
SELECT u.uid, u.forename, u.surname, ui.gender, GROUP_CONCAT(us.level ORDER BY us.af_id SEPARATOR ',') AS levels
FROM users u
LEFT OUTER JOIN user_scores us
ON us.uid=u.uid AND us.record_date > '2012-09-01' AND us.record_date < '2012-10-20'
JOIN user_info ui ON ui.uid =u.uid
GROUP BY u.uid
ORDER BY u.surname ASC
结果如下:
Joe Bloggs M 4,4,3
我希望能够扩大月份,以便我的查询能够返回af_id的更新结果。 因此,如果我将结果日期扩大到2012-09-01和2012-12-31之间。 我希望看到以下结果:
Joe Bloggs M 4,4,4
但是,我的查询(使用上面的SQL)返回以下结果:
Joe Bloggs M 4,4,3,4
任何帮助,将不胜感激。 提前致谢。
看来您通过纯巧的巧合获得了每个af_id的结果-示例数据中恰好有一行与每个af_id的设置日期范围相匹配。 您需要先按uid,af_id分组才能获得级别,我猜这里您需要最高的级别,因此MAX()适合。
SELECT u.uid, u.forename, u.surname, ui.gender, GROUP_CONCAT(us.level ORDER BY us.af_id ) AS levels
FROM users u
LEFT OUTER JOIN
( SELECT uid, af_id, MAX(level) as level
FROM user_scores
WHERE record_date > '2012-09-01' AND record_date < '2012-12-31'
GROUP BY uid, af_id ) us
ON us.uid=u.uid
JOIN user_info ui ON ui.uid =u.uid
GROUP BY u.uid
ORDER BY u.surname ASC
修改后的查询。 您声明它应该能够检索历史记录,听起来您只是对达到的最高水平感兴趣。 为此,内部查询只需要限制user_scores上的最大日期,并且可以简单地检索uid,af_id和MAX(level)。
然后可以将其加入users u
,然后GROUP_CONCAT可以向您返回焦点及其相关的最高得分。 如果稍后添加了其他焦点,则将返回它。
如果用户在焦点1.2中没有分数,则不会返回焦点1.2
SELECT
u.uid,
u.forename,
u.surname,
ui.gender,
GROUP_CONCAT(us.af_id) AS focusOrder,
GROUP_CONCAT(us.level ORDER BY us.af_id ASC) AS focusMaxLevels
FROM users u
INNER JOIN user_info ui
ON ui.uid =u.uid
INNER JOIN (
SELECT
uid,
af_id,
MAX(level) as level
FROM user_scores
WHERE record_date <= DATE('2012-10-20')
GROUP BY uid, af_id
ORDER BY uid ASC, af_id ASC
) AS us
ON us.uid = u.uid
GROUP BY u.uid
ORDER BY u.surname ASC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.