7

データベース構造

CREATE TABLE installs(
    id INT, PRIMARY KEY(id), 
    created DATETIME)

CREATE TABLE uninstalls(
    id INT, PRIMARY KEY(id),
    created DATETIME,
    install_id INT)

クエリ(「Mevs。MySQL」)

SELECT DATE(installs.created),
  COUNT(installs.id),
  COUNT(uninstall.id)
FROM installs
LEFT JOIN uninstalls ON uninstalls.install_id = installs.id
GROUP BY DATE(installs.created)

「期待される」出力

DATE(installs.created) | COUNT(installs.id) | COUNT(uninstalls.id) 
  2012-11-20           | *installs on date* | *uninstalls on date*

だから-私はその日に起こったインストール/アンインストールの数で、1日あたりの行を探しています。

問題

'インストール'のデータは毎日正しいです。しかし、毎日の「アンインストール」のデータは残念ながら正しくありません。

4

3 に答える 3

4

インストールとアンインストールを別々にカウントし、それぞれに他のカウントの列(ゼロ)を追加します。次に、2つをで結合し、UNION日付でもう一度グループ化し、各日付の最大値を取得します(追加されたゼロを削除するため)。

SELECT created as date, max(installs) as installs, max(uninstalls) as uninstalls
FROM
  (SELECT created, count(*) AS installs, 0 AS uninstalls
   FROM installs
   GROUP BY created
  UNION ALL
   SELECT created, 0 AS installs, count(*) AS uninstalls
   FROM uninstalls
   GROUP BY created) c
GROUP BY created
ORDER BY created
于 2012-11-21T23:19:44.217 に答える
0

この問題は、インストールとアンインストールをリンクしているために発生しています。つまり、特定の日付のインストールと、インストールの日付ではなく、それらのインストールのアンインストールを表示しています。

特定の日付の各イベントの数を確認する場合は、インストールIDではなく、その日付に参加する必要があります。大きなデータセットの場合、非常に遅くなります(オプティマイザーは、フィールドの関数でグループ化または結合するときに、フィールドのインデックスを使用できません)。

SELECT DATE(installs.created),
  COUNT(installs.id),
  COUNT(uninstall.id)
FROM installs 
LEFT JOIN uninstalls ON DATE(uninstalls.created) = DATE(installs.created)
GROUP BY DATE(installs.created)
于 2012-11-21T17:52:59.957 に答える
0

インストールとアンインストールのすべての日付を含むCTEを作成してから、参加してテーブルを個別にインストールとアンインストールします。

; WITH Dates AS
(
    SELECT DATE(created) AS created
    FROM
    (
        SELECT created
        FROM installs

            UNION ALL

        SELECT created
        FROM uninstalls
    ) a
    GROUP BY DATE(created)
)
, InstallCTE AS
(
    SELECT DATE(created) AS created
        , COUNT(*) AS c
    FROM installs
    GROUP BY DATE(created)
)
, UninstallCTE AS
(
    SELECT DATE(created) AS created
        , COUNT(*) AS c
    FROM uninstalls
    GROUP BY DATE(created)
)
SELECT d.created AS [date]
    , i.c AS install_count
    , u.c AS uninstall_count
FROM Dates d
LEFT JOIN InstallCTE i
    ON d.created = i.created
LEFT JOIN UninstallCTE u
    ON d.created = u.created
于 2012-11-21T20:43:20.683 に答える