sql >> データベース >  >> RDS >> Mysql

mySQLクエリ-最も人気のあるアイテムを表示する

    私の最初の提案は正しくないでした :

    SELECT
      date, item, SUM(cnt)
    FROM (
      SELECT
        date, item, count(item_id) AS cnt
      FROM test_popularity
      GROUP BY date, item_id
      ORDER BY cnt DESC
    ) t
    GROUP BY date;
    

    これは、外部の集計(日付による)が、cntによって順序付けられた内部派生テーブルの最初の行を選択することを誤って想定しています。実際、この動作は未定義であり、一貫性があるとは限りません。

    適切な解決策は次のとおりです。

    SELECT
      t1.date, t1.item, 
      (SELECT COUNT(*) FROM test_popularity WHERE date = t1.date) as total
      # see note!
    FROM test_popularity t1
    JOIN (
      SELECT date, item, item_id, COUNT(item_id) as count
      FROM test_popularity
      GROUP BY date, item_id
    ) AS t2
    ON t1.date = t2.date AND t1.item_id = t2.item_id
    GROUP BY t1.date;
    

    注:

    (SELECT COUNT(*)) AS totalを追加しました 質問が1つのクエリでこれを求めたからです。ただし、これは相関サブクエリであるため、スケーリングされません。これは、t1.dateごとにSELECT COUNT(*)サブクエリが実行されることを意味します。ベンチマークを行い、ニーズに適しているかどうかを確認してください。そうでない場合は、別のクエリで1日の合計を取得することをお勧めします。これらの結果をアプリケーションにマージします。



    1. テーブルからN行ごとにLINQからSQLへ

    2. Yiiで最後に挿入された値を取得する

    3. Rails、MySQL、Snow Leopard

    4. JSON配列内の要素を検索するためのインデックス