2016-11-17 94 views
0

首先我显示我当前的查询。左连接选择最后一行和左连接选择一行作为列

SELECT u.id, u.username, GROUP_CONCAT(DISTINCT up.weight) as weights, GROUP_CONCAT(DISTINCT pd.type_change, ':', pd.sum_type_change) as statistics 
FROM user u 
LEFT JOIN 
    (SELECT up.weight, up.user_id FROM user_parameter up WHERE up.date BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00' ORDER BY up.user_id, up.date ASC) up 
    ON u.id = up.user_id 
LEFT JOIN 
    (SELECT pd.type_change, count(pd.id) as sum_type_change, dd.user_id FROM diet_day dd 
    LEFT JOIN product_day pd ON dd.id = pd.diet_day_id 
    WHERE dd.date_start BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00' GROUP BY dd.user_id, pd.type_change) pd 
    ON u.id = pd.user_id 
GROUP BY u.id 

这工作得很好,但是我必须第一。减去和up.weight持续的,而不是

GROUP_CONCAT(DISTINCT up.weight) 

除此之外,我不得不改变

GROUP_CONCAT(DISTINCT pd.type_change, ':', pd.sum_type_change) 

这总是返回字符串如这[1:count,2:count,3:count,4:count] 而不是一列(group_concat)我需要有四个新列。

这是可能的所有这一切在MySQL查询?

+0

不能在普通的SQL返回一个变量的列数。 – Barmar

回答

1

您需要单独的子查询来获取第一个和最后一个up.weight

SELECT u.id, u.username, lastup.weight - firstup.weight as delta_weight, 
     GROUP_CONCAT(DISTINCT pd.type_change, ':', pd.sum_type_change) as statistics 
FROM user u 
LEFT JOIN 
    (SELECT up.weight, up.user_id 
    FROM user_parameter up 
    JOIN (SELECT user_id, MAX(up.date) AS maxdate 
      FROM user_parameter 
      WHERE date BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00' 
      GROUP BY user_id) AS maxup 
    ON up.user_id = maxup.user_id AND up.date = maxup.maxdate 
    WHERE up.date BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00') lastup 
    ON u.id = lastup.user_id 
LEFT JOIN 
    (SELECT up.weight, up.user_id 
    FROM user_parameter up 
    JOIN (SELECT user_id, MIN(up.date) AS mindate 
      FROM user_parameter 
      WHERE date BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00' 
      GROUP BY user_id) AS minup 
    ON up.user_id = maxup.user_id AND up.date = minup.mindate 
    WHERE up.date BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00') firstup 
    ON u.id = firstup.user_id 
LEFT JOIN 
    (SELECT pd.type_change, count(pd.id) as sum_type_change, dd.user_id 
    FROM diet_day dd 
    LEFT JOIN product_day pd ON dd.id = pd.diet_day_id 
    WHERE dd.date_start BETWEEN '2015-10-10 00:00:00' AND '2017-10-10 00:00:00' GROUP BY dd.user_id, pd.type_change) pd 
    ON u.id = pd.user_id 
GROUP BY u.id 

关于获得的统计数据在单独的列,而不是与GROUP_CONCAT串联当中,看到MySQL pivot table

+0

谢谢你试图帮助我。第一个左连接返回0行。我认为会发生这种情况,因为这个查询中的JOIN在所有表中都得到MAX日期的一条记录,而不是每个用户的MAX – Karpol

+0

你说得对,我在内部子查询中忘记了GROUP BY user_id。 – Barmar

+0

这工作正常。谢谢! – Karpol