2016-12-15 1 views
-2

Guter Abend ist,wie MySQL Abfrage auszulösen, wenn DATETIME- Vergangenheit

Ich habe 1 Tisch, wo ich speichere ein Element mit dem Typ: Datetime, Ich werde von einem Skript ein Datums in dieses Element einfügen auf PHP.

Wenn das Datum erreicht ist, möchte ich "datepast" von table2, erhöhen wir können es tun, indem wir "name" von table1 mit "person_name" von table2 vergleichen.

Nun ist die Frage, wie ein SQL-Skript auslösen, um diesen Job für mich zu erledigen, wäre es toll, wenn es in Echtzeit war.

Bereits Dank,

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

Entweder posten Sie Ihre Lösung oder löschen Sie die Frage – GurV

Antwort

0

Cronjobs und MySQL Ereignisse können einen guten Job, solche Dinge tun Handhabung. Aber die Abfragen, die Sie dort eingeben, müssen so eingerichtet sein, dass sie idempotent sind - das heißt, sie müssen so eingerichtet sein, dass sie, wenn Sie sie mehrmals ausführen, denselben Effekt haben, wie wenn sie einmal ausgeführt werden. Andernfalls haben Sie eine spröde Lösung.

Wenn Sie Daten basierend auf Ablaufzeiten wie finishtime verarbeiten, ist es normalerweise eine gute Idee, eine Abfrage oder eine Ansicht statt einer Aktualisierung zu verwenden.

Zum Beispiel können Sie diese Ansicht erstellen konnte

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

Dann SELECT * FROM table2 wird eine Ergebnismenge erzeugen wie SELECT person_name, datepast FROM table2 erzeugen könnten. Aber das SELECT-Resultset wird immer genau in der Zeit sein.

Warten! Sie sagen, ist nicht so ineffizient? Die Antwort ist, wahrscheinlich nicht, wenn Sie mehrere hunderttausend Zeilen oder mehr in Ihrem table haben. SQL ist für diese Art von deklarativen Daten erstellt.

+0

Vielen Dank, ich werde es morgen versuchen. –

0

können Sie verwenden MySQL Ereignisse oder einen Cronjob. Es ist keine Echtzeit, aber es kann nah sein.

Da Ihre Buchung nicht vollständig ist und Tabelle2 fehlt, kann ich Ihnen nur ein Beispiel geben, wie ein Ereignis eingerichtet wird. Innerhalb DO BEGIN and END $$ können Sie Ihre MySQL-Abfrage hinzufügen, um Datepast zu aktualisieren.

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

Ereignisse nicht standardmäßig aktiviert sind, müssen Sie

In /etc/mysql/my.cnf 

gehen und Ereignisse aktivieren, indem Sie eine Zeile innerhalb [mysqld] Tag legen.

[mysqld] 
event_scheduler=1 

und dann sudo service mysql restart