2

我在从 MySQL 数据库计算平均每日访问者时遇到了一些问题。我有一个自动填充 0 或 1 的列,具体取决于访问者是真正的访问者还是机器人。我的查询看起来像这样

SELECT
   COUNT( * ) / COUNT( DATEDIFF( NOW( ) , 
   SELECT * 
    FROM mw_visitors
    WHERE bot = 0
    ORDER BY ID ASC 
   LIMIT 1 ) )
FROM mw_visitors
WHERE bot = 0

但它不起作用。我的 PHPMyAdmin 告诉我,“SELECT * FROM mw_visitors where bot = 0 ORDER..”处的语法有错误。我在网上搜索过,但没有找到正确的东西。

编辑:结构http://pastebin.com/dm4Hjukr 获得真实的人类访客:

SELECT COUNT(DISTINCT `ip`) AS `visits`
FROM `mw_visitors` WHERE `bot` = 0 AND `time` BETWEEN
(SELECT `time` FROM `mw_visitors` WHERE `bot` = 0 ORDER BY `ID` ASC LIMIT 1) AND NOW()
4

2 回答 2

1

了解您的表看起来如何肯定会有很大帮助,但即使没有,您为什么不以更简单的方式对查询进行建模呢?

如果我理解正确,您希望获得访问您网站的真实访问者的数量,因此您需要过滤掉任何机器人。

像这样对查询建模不是更容易吗?

SELECT COUNT(`visitor_id`) AS `visits` FROM `mw_visitors` WHERE `bot` = 0 AND `date` BETWEEN ? AND ?;

(这两个问号是您要检查访问者点击的日期区域)。

于 2013-04-12T12:40:53.573 回答
0

好的,现在我看到了您的表结构。在这种情况下,您要查找的查询应该是:

SELECT COUNT(DISTINCT(`ip`)) / (SELECT ABS(DATEDIFF(NOW(),(SELECT `time` FROM `mw_visitors` ORDER BY `time` ASC LIMIT 1)))) AS `visits` FROM `mw_visitors` WHERE `bot` = 0 AND `time` BETWEEN NOW() AND (SELECT `time` FROM `mw_visitors` ORDER BY `time` ASC LIMIT 1);

我没有检查最后一个(SELECT...),但它应该没问题。

于 2013-04-12T13:35:18.850 回答