2

同じテーブル内の 2 つの値を比較して、違いがあるかどうかを確認しようとしています。現在、cms_statistics_pages テーブルには 1485 のレコードがありますが、次のクエリの場合:

SELECT
    cp.identifier,
    COUNT(csp1.statID) AS hits,
    COUNT(csp2.statID) AS hits_yesterday,
    IF(COUNT(csp1.statID)>COUNT(csp2.statID),1,0) AS growth
FROM cms_pages cp
LEFT JOIN cms_statistics_pages csp1
      ON csp1.pageID = cp.pageID
      AND DATE(csp1.datetime) = '2012-07-20'
LEFT JOIN cms_statistics_pages csp2
      ON csp2.pageID = cp.pageID
      AND DATE(csp2.datetime) = '2012-07-19'
GROUP BY cp.identifier

..解雇されると、次の結果が得られます。

identifier                  hits    hits_yesterday  growth
index                       13395   13395           0
siden-er-under-opdatering   638     638             0
vores-historie              0       3               0

これは私の目的には正しくありません。次に、変更した場合:

AND DATE(csp1.datetime) = '2012-07-20'

どのレコードとも一致しない日付まで

AND DATE(csp1.datetime) = '2012-07-21'

私の結果は次のようになります。

identifier                  hits   hits_yesterday   growth
index                       0      141              0
siden-er-under-opdatering   0      29               0
vores-historie              0      3                0

ヒットは正しいので、両方の結合にデータが含まれている場合、クエリがレコードを複数回カウントするかどうか疑問に思っています。

cms_pages のデータ例:

    pageID sectionID templateID 識別子 デフォルトのタイトル exclude_title
    1 1 1 index 1 SiteTech Framework 2012 へようこそ

cms_statistics_pages のデータ例:

    statID フロントエンド バックエンド pageID sectionID パネル datetime
    1 0 1 34 6 管理者 2012-07-17 12:34:14

4

2 に答える 2

0

複数のテーブルをカウントするためのより高度な方法を提供するこの投稿に出くわしました。これにより、クエリが同じレコードを複数回カウントできなくなる可能性があります。自分で試したことはありません-https://discussion.dreamhost.com/thread-9112.html

于 2012-07-23T09:27:00.157 に答える
0

そのため、クエリを少しいじっていて、左結合とサブクエリを含む解決策を見つけました。私のクエリは次のようになります。

SELECT 
    cp.identifier,
    now.hits AS hits,
    yd.hits AS hits_yesterday,
    IF(now.hits>yd.hits,1,0) AS growth
FROM cms_pages AS cp
LEFT JOIN 
    (
        SELECT
            pageID,
            COUNT(pageID) AS hits
        FROM cms_statistics_pages
        WHERE DATE(datetime) = '2012-07-20'
        GROUP BY pageID
    ) now
ON now.pageID = cp.pageID
LEFT JOIN
    (
        SELECT  pageID,
            COUNT(pageID) AS hits
        FROM cms_statistics_pages
        WHERE DATE(datetime) = '2012-07-19'
        GROUP BY pageID
    ) yd
ON yd.pageID = cp.pageID

この正しい結果が得られました!:

identifier                  hits    hits_yesterday  growth
index                       95      141             0
siden-er-under-opdatering   22      29              0
vores-historie              NULL    3               0
于 2012-07-25T09:04:37.793 に答える