2016-12-15 32 views
-2

晚上好,如何触发MySQL查询时DATETIME是过去

我有1台在那里我一个元素存储与类型:日期时间, 我会通过一个脚本来插入日期到这个元素在PHP上。

当日期到达时,我想从table2, 增加“datepast”,我们可以通过比较table1中的“name”和table2中的“person_name”来完成。

现在的问题是如何触发一个sql脚本来为我完成这项工作,如果它是实时的,那将是非常好的。

已经谢了,

create table if not exists table1 ( name varchar(64) NOT NULL,
finishtime DATETIME, id_table1 int NOT NULL AUTO_INCREMENT, primary key (id_table1));

create table if not exists table2 ( person_name varchar(64) NOT NULL,
datepast int, id_table1 int NOT NULL AUTO_INCREMENT, primary key (id_table1));

+1

要么发布您的解决方案或删除问题 – GurV

回答

0

Cronjobs和MySQL事件可以做好处理这样的事情。但是你在那里放置的查询必须设置为幂等 - 也就是说,它们必须被设置,所以如果你运行它们不止一次,它们与运行一次的效果相同。否则,你会有一个脆弱的解决方案。

当您根据过期时间(如finishtime)处理数据时,尝试使用查询或视图而不是更新通常是个好主意。

例如,你可以创建这个观点

CREATE OR REPLACE VIEW table2 AS 
SELECT name  AS person_name 
     COUNT(*) AS datepast 
    FROM table1 
    WHERE datepast <= NOW() 
    GROUP BY name 

然后,SELECT * FROM table2会生成设置就像SELECT person_name, datepast FROM table2可能产生的结果。但是SELECT结果集将始终准确无误。

等等!你说,是不是没那么低效?答案是,除非你在table中有几十万行或更多行,否则可能不会。 SQL是为这种声明性数据而构建的。

+0

谢谢,我会尝试它tomorow。 –

0

您可以使用MySQL事件或一个cronjob。这不是实时的,但它可以接近。

因为您发布的内容不完整且缺少table2,我只能举一个例子说明如何设置一个活动。在DO BEGIN and END $$里面,你可以添加你的MySQL查询来更新datepast。

DELIMITER $$ 
CREATE 
EVENT `increase_date_past` 
ON SCHEDULE EVERY 30 SECOND 
DO BEGIN 
{{READ DATE AND UPDATE TABLE2}} 
END $$ 
DELIMITER ; 

活动默认情况下不启动,你必须去

In /etc/mysql/my.cnf 

,并通过将线内[mysqld]标签激活事件。

[mysqld] 
event_scheduler=1 

然后sudo service mysql restart

相关问题