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

これは正常に動作しますが、私はこれに加えて、代わりに

GROUP_CONCAT(DISTINCT up.weight) 

の最初と最後のup.weightを減算する必要があり、私はこれはいつものように文字列を返す

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

を変更する必要がありますこの1:カウント2:カウント3:カウント4:カウント 1つの列(group_concat)ではなく、4つの新しい列が必要です。

これをすべてmysqlクエリで行うことは可能ですか?

+0

あなたは、通常のSQLの列の可変数を返すことができません参照してください。 – Barmar

答えて

1

最初と最後のサブクエリを別々に取得する必要があります。up.weightGROUP_CONCATでそれらを連結するのではなく、別の列に統計情報を取得に関して

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 

MySQL pivot table

+0

私を助けてくれてありがとう。最初の左結合は0行を返します。私は、このクエリ内のJOINがMAXの日付を持つレコードをすべてのテーブルで取得するため、ユーザーあたりMAXではなく、 – Karpol

+0

あなたが正しいと思います。内部サブクエリで 'GROUP BY user_id'を忘れました。 – Barmar

+0

これは正常に動作します。ありがとう! – Karpol

関連する問題