2016-12-15 2 views
-2

こんばんは、DATETIMEは

私はタイプの要素を格納する1台持っている過去のあるときにMySQLのクエリをトリガーする方法:日時、 私はスクリプトによって、この要素に日付を挿入するつもりですが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

cronジョブと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

ありがとう、私はそれを試してみましょう。 –

0

あなたはMySQLのイベントやcronジョブを使用することができます。それはリアルタイムではありませんが、それは近くにある可能性があります。

転記が完了せず、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