我正在处理报告的mysql查询。我们的想法是让一个简单的表格显示'reportTable',其值从不同的地方获取。然后我可以更容易地使用reportTable而不记住大量的连接等,并且还可以为其他项目共享此表。
INSERT INTO reportTable
(
-- long query grabbing results from various places
SELECT var1 FROM schema1.table1
SELECT var2 FROM schema2.table1
SELECT var2 FROM schema2.table1
etc
)
答案 0 :(得分:1)
这解决了您插入数据需要太长时间等问题。我明白这就像你每次重建你的桌子一样。因此,不要这样做,只需获取新表中尚未存在的数据。查看报表中是否已存在数据可能也很昂贵,只需获取增量即可。方法如下:
确保在每个表中都需要这样的列:
ALTER TABLE yourTable ADD COLUMN created timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ON UPDATE
子句当然是可选的,不知道您是否需要跟踪更改。如果是,请给我一个评论,我可以为您提供一个解决方案,您可以用它来记录您的数据。
现在你需要一个包含一些元信息的小表。
CREATE TABLE deltameta (tablename varchar(50), LSET timestamp, CET timestamp);
LSET是上次成功提取时间的缩写,是当前提取时间的CET。
当您获得数据时,它的工作方式如下:
UPDATE deltameta SET CET = CURRENT_TIMESTAMP WHERE tablename = 'theTableFromWhichYouGetData';
SELECT @varLSET := LSET, @varCET := CET FROM deltameta WHERE tablename = 'theTableFromWhichYouGetData';
INSERT INTO yourReportTable (
SELECT whatever FROM aTable WHERE created >= @varLSET AND created < @varCET
);
UPDATE deltameta SET LSET = CET WHERE tablename = 'theTableFromWhichYouGetData';
如果在插入脚本期间出现任何问题,则会在下次运行时获得相同的数据。此外,如果需要回滚,可以在此处使用事务处理。如果您需要帮助,请再次撰写评论。
答案 1 :(得分:0)
我可能错了,但你似乎在谈论基本观点。您可以在此处阅读对视图的介绍:http://techotopia.com/index.php/An_Introduction_to_MySQL_Views,以下是mysql视图文档:http://dev.mysql.com/doc/refman/5.0/en/create-view.html