これは私に2日間の睡眠をとどめる問題です。MySQL Joinが返す予定以上に
私は出力をします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]を参照してくださいよ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
");
を持っています結果はより高いものになります。私はカウントダウンし、postid 8からのcountviewsは '108'ではなく '73'でなければならないことを確認します。それについての見知らぬ事はpostid 8の最後のカウントが '35'であるということです。 '108' - '35' = '73'。だから、ビューテーブルは数えられますか?
右ジョイン、左ジョイン、インナージョインはすべて同じ結果を示します。
あなたはここにいくつかの謎があるように行動しています。しかし、集計関数とGROUP BY句を省略すると、戻される行、戻される行の数、それぞれの数、および理由がわかります。 – Strawberry
mysql joinは** expected **の行数を返します。あなたは、表示されているすべての行を 'SUM'S(または使用する集約関数)として理解する必要があります。 – KaeL
私は、訪問者にはpostidid 8とviews 2の3行があることを理解しています。これは、ビューで余分な行が最後のカウントとともに表示されることを意味します。その行のカウントを0に変更するにはどうすればよいですか? – Paultje182