Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL连接返回的结果超出预期_Php_Mysql_Join - Fatal编程技术网

Php MySQL连接返回的结果超出预期

Php MySQL连接返回的结果超出预期,php,mysql,join,Php,Mysql,Join,这个问题让我睡了两天 我有两张桌子 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 1

这个问题让我睡了两天

我有两张桌子

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
");
当我打印输出时,我将看到以下结果

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]结果高于Expact。我要数一数,看看postid8的计数不能是'108'而是'73'。奇怪的是,postid8的最后一次计数是“35”108'减去'35'='73'。那么视图表是双倍的吗


右连接、左连接和内部连接给出了所有相同的结果

如果你想计数,就不能在这里加入。您建立的关系是创建视图表的倍数,以防在搜索参数中为同一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

希望我没弄错。如果有帮助,请告诉我:

你表现得好像这里有些神秘。但是如果省略聚合函数和GROUPBY子句,那么您将确切地知道返回了哪些行,每个行有多少行,以及返回的原因。您只需要了解它对所有显示的行进行求和或使用任何聚合函数。我知道,在访问者中,postid 8和views 2中分别有3行。这意味着在视图中,最后一次计数也会显示一个额外的行。如何将该行的计数更改为0?必须稍微编辑它。忘记了日期相等的第二个条件。很高兴我能帮上忙。当我添加I.date=a.date时,countvisitors并没有得到好的结果。当我离开时,它工作得很好。非常感谢。好啊我会编辑的。从您的查询中收集到它是需要的。好的,这不是解决方案,我现在得到了:从访客b中选择COUNTb.id,其中b.date介于日期_SUB2016-07-17之间,间隔3天到2016-07-17,b.postid=a.postid AS countvisitors将b.date=a.date更改为介于之间的日期,然后工作正常!