1

次の 2 つのクエリがありますが、異なる結果が返されます。たとえば、1 つの端末から合計金額を要求すると、456 が得られます。

それから 15 分間隔で尋ねると、すべての値を数えると 474 になります。

合計金額を取得するための私のクエリは次のとおりです

SELECT   SUM(logs.amount) * ei_relationships.itemprice as income
  ,      currency
FROM     ei_relationships
  RIGHT OUTER JOIN logs ON ei_relationships.id = logs.ei_relationship_id 
WHERE    ei_relationships.event_id = 1
     AND logs.serial = '5B:13:52:28:71:21:ED:F1'
ORDER BY currency, log_time ASC

これは同じデータを取得するための私のクエリですが、今では 15 分で分割しています

SELECT   SUM(logs.amount) * ei_relationships.itemprice as income
  ,      UNIX_TIMESTAMP(log_time) - UNIX_TIMESTAMP(log_time)%(900) as hour
  ,      currency
FROM     ei_relationships
  RIGHT OUTER JOIN logs ON ei_relationships.id = logs.ei_relationship_id
WHERE    ei_relationships.event_id = 1
     AND logs.serial = '5B:13:52:28:71:21:ED:F1'
GROUP BY hour
ORDER BY currency, log_time ASC
4

1 に答える 1

0

マニュアルが言うように:

GROUP BY句を含まないステートメントでグループ関数を使用すると、すべての行をグループ化することと同じになります。

また、次のように述べています。

MySQL は の使用を拡張して、選択リストが句GROUP BYで指定されていない非集計列を参照できるようにします。GROUP BYこれは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、 で指定されていない各非集計列のすべての値がGROUP BY各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。

したがって、両方のクエリで、列の合計にamount列の値のいずれかが乗算されitempriceます。MySQL がこれらの値のどれを使用するかは不確定です。したがって、すべてのレコードが同じ を持たない限りitemprice、結果incomeも不確定になります。

おそらくあなたは意図しGROUP BY currencyて選択しましたSUM(logs.amount * ei_relationships.itemprice) AS incomeか?

于 2012-05-22T20:05:55.473 に答える