这些步骤可以更快地缩短您的处理时间,但可能会花费您比您预期的更多的努力。
假如说 :
- 变量 $qry 包含将结果存储到变量 $q 的查询
- 你有如下三个表
- 您进行查询,在您的示例中由 $q 使用,依次从 table_1、table_2 和最后 table_3 开始
表 table_1 :
id | col_timestamp | parent_table | parent_id
---------------------------------------------
1 | 1374531523.343| NULL | NULL
表 table_2 :
id | col_timestamp | parent_table | parent_id
---------------------------------------------
1 | 1374531520.444| NULL | NULL
2 | 1374531524.012| table_1 | 1
3 | 1374531556.012| NULL | 1
4 | 1374531556.512| table_2 | 3
表 table_3 :
id | col_timestamp | parent_table | parent_id
---------------------------------------------
1 | 1374531521.111| table_2 | 1
2 | 1374531523.111| table_1 | 1
解释:字段 parent_table 是一个 varchar,表示当前行是指 table_1、table_2 或 table_3。字段 parent_id 是指字段 parent_table 指向的表中的字段 id。
现在,每次用户插入所有表时,我们都需要检查数据库中是否已经存在类似的事件。我们可以通过使用触发器来做到这一点。每次向 table_2 插入一行时都会触发此触发器:
DELIMITER $$
USE `your_database`$$
DROP TRIGGER /*!50032 IF EXISTS */ `before_insert_table_2`$$
CREATE TRIGGER `before_insert_table_2` BEFORE INSERT
ON `table_2` FOR EACH ROW
BEGIN
DECLARE var_id INTEGER ;
DECLARE var_table VARCHAR (10) ;
SELECT id, parent_table INTO var_id, var_table
FROM
( SELECT id, 'table_1' AS parent_table, col_timestamp
FROM table_1
WHERE parent_id IS NULL
AND col_timestamp BETWEEN NEW.col_timestamp - 1 AND NEW.col_timestamp + 1
UNION
SELECT id, 'table_2' AS parent_table, col_timestamp
FROM table_2
WHERE parent_id IS NULL
AND col_timestamp BETWEEN NEW.col_timestamp - 1 AND NEW.col_timestamp + 1
)
ORDER BY ABS(col_timestamp - NEW.col_timestamp), parent_table
LIMIT 1 ;
SET NEW.parent_id = var_id ;
SET NEW.parent_table = var_table ;
END ;
$$
DELIMITER ;
对 table_1 和 table_3 执行类似的步骤。
下一步是将 parent_table 和 parent_id 设置为现有数据。您可以修改 $qry 以获取表名及其 id 并更新到相关行。此步骤只需运行一次。
下一步是修改您的查询以获取事件。这是一个例子:
SELECT 'table_1' original_table, id
FROM table_1
WHERE parent_id IS NULL
UNION
SELECT 'table_2' original_table, id
FROM table_2
WHERE parent_id IS NULL
UNION
SELECT 'table_3' original_table, id
FROM table_3
WHERE parent_id IS NULL
最后一步是修改您的程序以实现数据库中的更改。
希望这会有所帮助。