【问题标题】:MySQL compare two values on same tableMySQL比较同一张表上的两个值
【发布时间】:2012-07-23 09:17:15
【问题描述】:

我正在尝试比较同一张表中的两个值,并检查是否存在差异。 现在,我在 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 索引 1 欢迎来到 SiteTech 框架 2012

来自 cms_statistics_pages 的示例数据:

statID frontend backend pageID sectionID panel datetime 1 0 1 34 6 管理员 2012-07-17 12:34:14

【问题讨论】:

    标签: mysql compare


    【解决方案1】:

    我遇到了这篇文章,它提供了一种更高级的方法来计算多个表,这可能会阻止查询多次计算同一条记录。自己没试过 - https://discussion.dreamhost.com/thread-9112.html

    【讨论】:

      【解决方案2】:

      所以我一直在搞乱查询,并找到了一个包含左连接和子查询的解决方案。我的查询现在看起来像:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多