【问题标题】:PHP PDO insert if not exists last 15 minute如果最后 15 分钟不存在 PHP PDO 插入
【发布时间】:2013-10-24 09:56:28
【问题描述】:

我正在尝试制作一个非常简单的统计脚本。

我有一张桌子data ( ip, date, page )。 仅当自最后 15 分钟以来没有相同的 ip 和页面时,我才想将 ip 和当前页面插入到此表中。

这是我尝试的最后一条 SQL:

INSERT INTO data ( `ip` , `date` , `page` )
SELECT ( :ip , NULL , :page )
WHERE NOT EXISTS (
    SELECT * FROM data
    WHERE `ip` = :ip AND `page` = :page AND date BETWEEN timestamp(DATE_SUB(NOW(), INTERVAL 15 MINUTE)) AND timestamp(NOW())
)

“不存在”中的 SELECT 单独使用时有效。 任何帮助表示赞赏!

【问题讨论】:

  • 你有主键吗?提示:您应该始终拥有一个主键(如果您没有,MySQL 将为您创建一个代理主键)。

标签: php mysql sql pdo


【解决方案1】:

感谢这个问题,我设法让它工作了:PHP PDO INSERT WHERE NOT EXISTS statement not working

这是有效的 SQL:

INSERT INTO data (ip, date, page)
SELECT * FROM (SELECT :ip , NULL, :page ) as tmp
WHERE NOT EXISTS (
    SELECT ip
    FROM data
    WHERE ip = :ip
        AND page = :page
        AND date >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
    LIMIT 1
)

问题是,我不确定了解它的所有内容,我不喜欢这样,所以我会尝试查找更多信息!

【讨论】:

  • 如果没有tmp,则返回此错误Every derived table must have its own alias。我插入 NULL 因为 date 是我表中的自动 current_timestamp。
  • 如果这可行,您可以验证它。我更了解您现在想做什么,之前的“select * from”!
  • 这应该可以,但请考虑将WHERE 子查询改进为SELECT ip FROM data WHERE ip = :ip AND page = :page AND `date` > DATE_SUB(NOW(), INTERVAL 15 MINUTE) LIMIT 1。另外,考虑添加一些索引,尤其是迄今为止。
  • 感谢您的改进,我编辑了答案,并将日期行更改为主键。一切都像一个魅力:)
【解决方案2】:

“不存在的地方”无效

你必须做 2 个 sql 查询:

$sql = 'SELECT * FROM data
    WHERE `ip` = :ip AND `page` = :page AND date BETWEEN timestamp(DATE_SUB(NOW(), INTERVAL 15 MINUTE)) AND timestamp(NOW())';
$sth = $pdo->prepare($sql);
$sth->execute(array(':ip' => 'that ip', ':page' => 'that page'));
if ($sth->rowCount() === 0)
{
   $sql = 'INSERT INTO data ( `ip` , `date` , `page` )
VALUES (:ip , NULL , :page)';
   // etc.
 }

【讨论】:

  • 如果您需要在多个查询中对表进行更新,请不要忘记启动事务,否则可能会出现竞争条件。
  • 此代码将成为竞争条件的主题并导致许多重复。交易几乎没有帮助
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多