首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql查询if语句

mysql查询if语句
EN

Stack Overflow用户
提问于 2009-12-20 16:58:43
回答 4查看 867关注 0票数 0

为了保持这个简单,假设我在php中制作了一个基本的页面查看计数器,它将每个页面的计数存储在mysql表中。该表有两列: PAGE_ID和COUNT。

我在每一页中添加了以下代码:

代码语言:javascript
复制
$query = "INSERT INTO table VALUES ('$page_id', '1')
         ON duplicate KEY UPDATE COUNT=COUNT+1";

$result = mysqli_query($cxn, $query);

为了确保每个查看页面的人只在我添加PHP会话后触发计数器。基本上,如果您查看一个页面,则page_id存储在会话中,计数器php代码在触发计数器之前检查该会话。在我自己的测试中做得很好。

有些页面获得了太多的视图,我怀疑是重复的,所以我开始记录IP和用户代理。在大约10%的情况下,IP会在几分钟内触发同一页的计数器2-3次。

第一个问题,,是什么导致了重复?这个问题似乎主要发生在IE8和Safari上,但我至少有一个IE7和IE6的例子。php会话是否存在已知问题?我应该用饼干代替吗?

第2部分:我修改了我的表,使它现在存储触发计数器的最后一个unix时间戳和最后一个IP。

我想修改我的查询,以便它在运行"COUNT=COUNT+1“之前检查以下内容:

代码语言:javascript
复制
If the current IP is the same as the last stored IP for this page {

     check that it's been at least 5 minutes before doing COUNT=COUNT+1

} else { COUNT=COUNT+1; }

第二个问题,我如何在mysql查询中写入它,同时保留“在重复键上”语句?

我知道这句话不会100%准确,但在我弄明白为什么会话似乎不起作用之前,这是可行的。我的网站流量很低,在5分钟的时间内,我很少能在同一个页面上获得超过1000名访问者。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2009-12-20 18:36:53

我建议您试着看看是否可以修复PHP,但忽略这一点。您可以存储unixtime戳除以300 (IE,每隔5分钟)。

$query =“插入到OtherTable值中(‘$OtherTable_id’,'$IP_ADDRESS',(UNIX_TIMESTAMP(NOW()/300))”;

如果更新的记录为0,则不需要更新页面计数。

票数 2
EN

Stack Overflow用户

发布于 2009-12-20 17:16:00

1.造成重复的原因是什么?

有些页面获得太多的视图,我怀疑是重复的,所以我开始记录IP和用户代理。在大约10%的情况下,IP会在几分钟内触发同一页的计数器2-3次。

无法知道请求页面的主机是否位于NAT路由器后面--对您来说,请求具有相同的IP,但实际上是另一台主机。cookie或会话将帮助您在每个工作站的基础上进行隔离,不过我想知道何时将信息写入数据库。

2.如何在mysql查询中写入该语句,同时保留“在重复键上”语句?

我不认为需要COUNT = COUNT + 1,因为SQL有一个计数函数:

代码语言:javascript
复制
  SELECT page_id,
         COUNT(*) 'num_hits'
    FROM ZZZ_NETWORK
   WHERE page_id = ?
GROUP BY page_id

如果您在ZZZ_NETWORK中使用以下结构

主key

  • ip_address,key

  • timestamp,主键

  • page_id

...you不必担心重复的密钥处理,它可以让您知道在特定的一天、一周、几个月/等等有多少次点击。包括时间戳在内的将确保永远不会有重复的

一个月后,如果每页视图使用一行,我的表中就会有数千行。

驱动器空间非常便宜,有一个时间戳,这样你就可以得到数据,这对于报告来说是非常宝贵的。但是,您也不必保存所有的数据--您可以通过将数据转储到文件中来将其存档,以便在必要时可以检索数据。

,我不明白它如何保证我永远不会得到复制。

时间戳包括日期(2009年12月25日)和时间(上午7:00)。一些datetime数据类型会下降到每秒的几个部分。这使得使用给定IP地址的给定page_id几乎不可能有相同的日期和时间--即使我想单击刷新按钮,也不能足够快。因此,记录永远不可能重复,因为三列中的最后一列每次都有不同的值(没有双关意)。

票数 1
EN

Stack Overflow用户

发布于 2009-12-20 17:08:34

您要寻找的是一个CASE语句:http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

一个示例CASE语句:

代码语言:javascript
复制
SELECT name,
       (CASE WHEN is_happy THEN "Happy!"
        ELSE "sad." END) as happiness 
FROM user_state;

它们也可以用于UPDATEINSERT

我怀疑你想看IE的东西,而不是。我过去也遇到过类似的问题,最后不得不使用javascript来减少点击次数。我不确定是IE用户双击东西,还是IE很奇怪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1936339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档