MySQL - 选择行时更新表

时间:2014-12-11 21:28:27

标签: php mysql

我有以下查询:

SELECT name FROM restaurants WHERE city='Kalmar' LIMIT 100

这是应该的,但现在我想扩展一些功能。 我想要计算每天选择行的次数。

假设我们设法从查询中选择了5家餐馆,我想为他们每个人做这样的事情:

INSERT INTO statistics (date, restaurant_id, number_of_selects) VALUES('{$current_date}', (The restaurants ID), 1) ON DUPLICATE KEY UPDATE number_of_selects = number_of_selects + 1"

此代码的作用是增加统计表内的餐馆选择数量。如果该行不存在(意思是,它是第一个选择),它将创建该行。

现在问题出现了!
我能做的是在PHP中循环所有结果并使用第二个查询。然而,这是一个性能杀手。我正在寻找一种同时使用这两个查询的方法来获得最佳性能。

编辑: 我想保留我选择的数据(在这种情况下是餐馆的名称)。

提前致谢,
通帕

2 个答案:

答案 0 :(得分:0)

您可以一次完成所有插入。

您希望ON DUPLICATE KEY UPDATE的统计信息(date,restaurant_id)上有一个多列唯一键来完成其操作。

INSERT INTO statistics (date, restaurant_id, number_of_selects)
SELECT '{$current_date}', restaurant_id, 1
FROM restaurants WHERE city='Kalmar' LIMIT 100
ON DUPLICATE KEY UPDATE number_of_selects = number_of_selects + 1

LIMIT 100此时似乎很可疑。也许不说了?此外,也许使用MySQL的DATE(NOW())代替{$current_date}

答案 1 :(得分:-1)

我建议先将结果插入临时表中。然后使用此表更新统计信息表,然后将结果返回给php。这将消除游标/循环迭代结果集的需要(这会破坏你的性能)

类似于:

--Get the restaurants
CREATE TEMPORARY TABLE IF NOT EXISTS tempTable AS
    (SELECT id, name
    FROM restaurants
    WHERE city='Kalmar'
    LIMIT 100
    )

--Update the statistics
INSERT INTO statistics (date, restaurant_id, number_of_selects)
SELECT DATE(), id
FROM tempTable
ON DUPLICATE KEY UPDATE number_of_selects = number_of_selects + 1

--Return data to PHP
SELECT name from tempTable 

我还没有检查语法等,但我希望这样的东西可以工作