MySQL比较同一表上的两个值

MySQL比较同一表上的两个值,mysql,compare,Mysql,Compare,我试图比较同一个表中的两个值,并检查是否存在差异。 目前,我在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

我试图比较同一个表中的两个值,并检查是否存在差异。 目前,我在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_页面的示例数据:

pageID sectionID templateID identifier default title exclude_title 1 1 1 index 1 Welcome to SiteTech Framework 2012 pageID sectionID templateID标识符默认标题排除\u标题 1索引1欢迎使用SiteTech Framework 2012 cms_统计_页面中的示例数据:

statID frontend backend pageID sectionID panel datetime 1 0 1 34 6 admin 2012-07-17 12:34:14 statID前端后端pageID sectionID面板datetime 101346管理员2012-07-1712:34:14
我遇到了这篇文章,它提供了一种更高级的跨多个表计数的方法,这可能会阻止查询对同一条记录进行多次计数。我自己还没有尝试过-

我发现这篇文章提供了一种更高级的跨多个表计数的方法,这可能会阻止查询对同一条记录进行多次计数。我自己还没有尝试过-

所以我对查询做了一些修改,找到了一个包括左连接和子查询的解决方案。我的查询现在看起来像:

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

所以我对查询做了一些修改,找到了一个包括左连接和子查询的解决方案。我的查询现在看起来像:

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