2016-07-18 9 views
2

これは私に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'。だから、ビューテーブルは数えられますか?

右ジョイン、左ジョイン、インナージョインはすべて同じ結果を示します。

+0

あなたはここにいくつかの謎があるように行動しています。しかし、集計関数とGROUP BY句を省略すると、戻される行、戻される行の数、それぞれの数、および理由がわかります。 – Strawberry

+0

mysql joinは** expected **の行数を返します。あなたは、表示されているすべての行を 'SUM'S(または使用する集約関数)として理解する必要があります。 – KaeL

+0

私は、訪問者にはpostidid 8とviews 2の3行があることを理解しています。これは、ビューで余分な行が最後のカウントとともに表示されることを意味します。その行のカウントを0に変更するにはどうすればよいですか? – Paultje182

答えて

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 

希望を私は右のそれを得ました。これが助けてくれたら教えてください:)

+0

ありがとう、これは解決策です!ありがとう! – Paultje182

+0

少し編集する必要がありました。 2番目の条件(日付の平等)を忘れてしまった。お役に立てて嬉しいです。 – TehSphinX

+0

i.date = a.dateを追加すると、countvisitorsには良い結果が与えられません。私がそれを残すとき、うまくいきます。ありがとうございました! – Paultje182

関連する問題