【发布时间】: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?