0

次のようなテーブルがあるとします。

id; day; daily
1; 2013-07-01; 50.00
1; 2013-07-02; 60.00
1; 2013-07-03; 70.00
1; 2013-07-04; 80.00

このクエリ:

SELECT
   id
   day,
   daily,
   SUM(daily) total
FROM
   table
GROUP BY
   id
ORDER BY
   day DESC

戻り値:

1; 2013-07-04; 80.00; 260.00

これまでのところすべて順調です。

私の質問は次のとおりです。すべての「合計されていない」値のステートメントによる順序に依存するのは安全ですか? 最高の日付の行の「毎日」の値を確実に読み取る必要があります。

ありがとうございました、

ピーター

PS 同様の質問を扱っているスレッドをいくつか見つけましたが、それらはすべて、私の場合はオプションではないサブクエリを使用していました。

4

2 に答える 2

4

いいえ、これに頼るのは絶対に安全ではありません。実際、この構造は論理的に無意味であり (無効な SQL です)、MySql でまだそれを実行できるという事実は... 悪いことです。マニュアルからの抜粋は次のとおりです。

ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。 さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する各グループ内の値には影響しません。

最後の行と合計を取得する場合は、2 つの別個のクエリを使用するだけです。1 つは最後の行用で、もう 1 つは合計用です。

于 2013-08-26T13:40:32.690 に答える
0

あなたのクエリはまったく問題ありません。それはあなたが望むことをしません:

SELECT id, day, daily, SUM(daily) total
FROM table
GROUP BY id
ORDER BY day DESC;

フィールドdayとフィールドdailyは、データの任意の行から取得されます。はgroup by のORDER BYに処理されます。必要なことを行う正しい方法は、サブクエリを使用するか、次の/メソッドを使用することです。group_concat()substring_index()

SELECT id, max(day) as day,
       substring_index(group_concat(daily order by day desc), ',', 1) as daily,
       SUM(daily) as total
FROM table
GROUP BY id
ORDER BY day DESC;

これがdaily文字列になります。数値にしたい場合は元に戻してください。

于 2013-08-26T13:43:17.227 に答える