1

日付に基づいてレコードのグループの最新のレコードのみを取得するクエリを作成しようとしています。

テーブルのレイアウトは次のとおりです。

| date | category | action | label | label2 | count_today | count_total | period |

主キーは、列、、、、、、dateに基づいています。フォーマットがあり、期間は、、、の値を持つことができます。categoryactionlabellabel2perioddateyyyy-mm-ddDayWeekmonth

のユニークな組み合わせごとcategory | action | label | label2に、最新の日付のレコードが必要です。

これに対する私の最初の試みはこれでした:

SELECT * FROM `statistic` 
WHERE 
 (action='total' OR action='' OR category='user')
 AND
 (period='day' 
   OR (period='week' AND DATEDIFF(now(), `date`) > 30)
   OR (period = 'Month' AND DATEDIFF(now(), `date`) > 7*26)
 )
GROUP BY category, action, label, label2
ORDER BY date DESC

このクエリの問題は、ORDERBYの前にGROUPBYを実行し、誤ったレコードが返されることです。

検索したところ、私が欲しいのはグループ単位の最大クエリと呼ばれるものであることがわかりました。

私の次の試みはこれでした:

SELECT s1.* FROM `statistic` AS s1
LEFT JOIN statistic AS s2 
ON 
 s1.category = s2.category
 AND s1.action = s2.action
 AND s1.label = s2.label
 AND s1.label2 = s2.label2
 AND s1.date > s2.date
WHERE 
   (s1.action='total' OR s1.action='' OR s1.category='user')
   AND
   (s1.period='day' 
   OR (s1.period='week' AND DATEDIFF(now(), s1.`date`) > 30)
   OR (s1.period = 'Month' AND DATEDIFF(now(), s1.`date`) > 7*26)
 )
GROUP BY category, action, label, label2

しかし、このクエリでも正しい結果が得られません(最初のクエリと似ています)。

必要なデータを取得する方法はありますか?

4

1 に答える 1

4

グループごとの最大値が必要なのは正しいですが、各グループの最新の日付を見つけるサブクエリを使用してテーブルを結合することで、これを実現します。

SELECT * FROM statistic NATURAL JOIN (
  SELECT   category, action, label, label2, MAX(date) date
  FROM     statistic
  GROUP BY category, action, label, label2
) t

そして、次のフィルターがまだ必要な場合:

WHERE 
 (action='total' OR action='' OR category='user')
 AND
 (period='day' 
   OR (period='week' AND DATEDIFF(now(), `date`) > 30)
   OR (period = 'Month' AND DATEDIFF(now(), `date`) > 7*26)
 )
于 2012-11-19T11:00:55.377 に答える