0

注文番号を検索するクエリに取り組んでいます。その日に固有の注文番号をフィルタリングする必要があります。そのために、メインクエリで count(distinct order_number) を使用しました。このクエリは、フロント エンドから開始日と終了日を取得して使用します。ただし、範囲内の 2 日間同じ order_number がある場合、両方の日にカウントされます。つまり、1 日のユニークな注文数を数えます。最初は、日付にいくつかのループを使用して結果を合計することを考えていましたが、それは私には正しくありません。同じクエリを使用して、日付に基づいて異なる注文用に変更することにもっと興味があります。これが私のクエリです:

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS DATE,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY DATE

8 月 29 日の日付について、注文 o1、o2、o1、o3、o2 があるとします。これらを 3 つの異なる注文としてカウントします。つまり、8 月 30 日の注文 o1、o2、03、注文 o1、o4、o4、o1 としてカウントします。 2 つの異なる注文、つまり o1、o4

しかし、8 月 29 ~ 30 日のクエリを実行すると、3+2 = 5 のカウントを取得する必要があります。つまり、o1 は、2 つの異なる日付に属する範囲で 2 回カウントされます。

4

1 に答える 1

2

WITH ROLLUPこの場合、修飾子はあなたの目的を果たすかもしれないと思います

SELECT 'site1' AS site,
  DATE_FORMAT(l.login_time, '%m/%d/%Y') AS `DATE`,
  COUNT(DISTINCT osh.order_num) AS total_orders
FROM order_history o
INNER JOIN logs l ON o.userID = l.id
WHERE o.date_time BETWEEN 1380524400 AND 1380610799
  AND l.LOGIN BETWEEN FROM_UNIXTIME(1380524400) AND FROM_UNIXTIME(1380610799)
GROUP BY `DATE` WITH ROLLUP

これにより、データを合計する余分な行がデータの最後に追加されtotal_ordersます ( の NULL 値を使用DATE) 。

この修飾子に関するドキュメントは次のとおりです。http://dev.mysql.com/doc/refman/5.5/en/group-by-modifiers.html

于 2013-10-04T22:03:29.883 に答える