繁体   English   中英

MySQL GROUP CONCAT重复项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM