2016-11-17 91 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