【问题标题】:MySQL Join returns more than expectedMySQL Join 返回的结果超出预期
【发布时间】:2016-11-20 20:50:08
【问题描述】:

这是一个让我无法入睡 2 天的问题。

我有两张桌子

views 

id | postid |   date     | count
=================================  
13 |   8    | 2016-07-16 |  38
16 |   8    | 2016-07-17 |  35
15 |   9    | 2016-07-16 |  7
17 |   9    | 2016-07-17 |  32
14 |   12   | 2016-07-16 |  17
18 |   12   | 2016-07-17 |  13


visitors 

id | postid |   date     | ip
=================================  
13 |   8    | 2016-07-16 |  127.0.0.1
17 |   8    | 2016-07-17 |  127.0.0.1
18 |   8    | 2016-07-17 |  127.0.0.1
16 |   9    | 2016-07-16 |  127.0.0.1
19 |   9    | 2016-07-17 |  127.0.0.1
14 |   12   | 2016-07-16 |  127.0.0.1
15 |   12   | 2016-07-16 |  127.0.0.1
20 |   12   | 2016-07-17 |  127.0.0.1
21 |   12   | 2016-07-17 |  127.0.0.1

还有下面的查询

$query = $wpdb->get_results("
    SELECT
        SUM(a.count) AS countviews, 
        COUNT(b.ip) AS countvisitors,
        a.postid
    FROM views a
    RIGHT JOIN visitors b
        ON a.postid=b.postid
        AND a.date=b.date
    WHERE 
        a.date
    BETWEEN 
        DATE_SUB('2016-07-17', INTERVAL 3 DAY) 
    AND 
        '2016-07-17' 
    GROUP BY 
        a.postid
    ORDER BY 
        countviews DESC
");

当我 print_r 输出时,我会看到以下结果

Array
(
    [0] => stdClass Object
        (
            [countviews] => 108
            [countvisitors] => 3
            [postid] => 8
        )

    [1] => stdClass Object
        (
            [countviews] => 60
            [countvisitors] => 4
            [postid] => 12
        )

    [2] => stdClass Object
        (
            [countviews] => 39
            [countvisitors] => 2
            [postid] => 9
        )

 )

只有 [countviews] 结果高于预期。我要数一数,发现来自 postid 8 的 countviews 不能是 '108' 而是 '73'。奇怪的是 postid 8 的最后一个计数是'35'。 “108”减去“35”=“73”。所以视图表是双倍的?

RIGHT JOIN、LEFT JOIN 和 INNER JOIN 给出了相同的结果。

【问题讨论】:

  • 你表现得好像这里有些神秘。但是,如果您省略聚合函数和 GROUP BY 子句,那么您将确切知道返回了哪些行、(每行)有多少行以及原因。
  • 您的 mysql 连接返回 预期 行数。您只需要了解它SUMS(或您使用的任何聚合函数)显示的所有行。
  • 我了解,在访问者中,postid 8 和视图 2 中有 3 行。这意味着在视图中还会出现最后一个计数的额外行。如何将该行的计数更改为 0?

标签: php mysql join


【解决方案1】:

如果你想数数,你不能在这里加入。您所做的关系是创建多个视图表,以防同一 postid 的搜索参数中有多个天。

您可以通过使用子查询来避免这种情况:

SELECT
    SUM(a.count) AS countviews,
    (SELECT COUNT(b.ip) FROM visitors i WHERE b.date BETWEEN DATE_SUB("2016-07-17", INTERVAL 3 DAY) AND "2016-07-17" AND i.postid = a.postid) AS countvisitors,
    a.postid
FROM views a
WHERE 
    a.date
BETWEEN 
    DATE_SUB('2016-07-17', INTERVAL 3 DAY) 
AND 
    '2016-07-17' 
GROUP BY 
    a.postid
ORDER BY 
    countviews DESC

希望我做对了。让我知道这是否有帮助:)

【讨论】:

  • 不得不稍微修改一下。忘记了第二个条件(日期相等)。很高兴我能帮上忙。
  • 当我添加 i.date=a.date 时,countvisitors 没有得到好的结果。当我离开时,它工作得很好。谢谢!
  • 好的。我会编辑那个。从您的查询中收集到它是需要的。
  • 好的,这不是解决方案,我现在知道了:(SELECT COUNT(b.id) FROM visitor b WHERE b.date BETWEEN DATE_SUB(''2016-07-17'' , INTERVAL 3 DAY) AND ''2016-07-17'' AND b.postid = a.postid) AS countvisitors 将 b.date=a.date 更改为之间的日期,然后它工作正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2019-09-06
  • 2018-12-16
相关资源
最近更新 更多