我有一个使用MYSQL数据库的销售软件,我想使用PHP进行网络扩展。该软件每天为每天的交易创建一个具有相同列但名称类似sales_data_Yearmonthday的新表。
例如
sales_data_20190122
sales_data_20190123
sales_data_20190124
sales_data_20190125
sales_data_20190126
sales_data_20190127
sales_data_20190128
所以我的问题是,如果我想获取最近7天的销售报告,查询这些表的最佳方法是什么?
UNION ALL 是连接所有表的一种方法,但是还有其他方法可以实现最佳性能,因为每年将创建356个表,每个表可能包含5000多个记录。
它可能不是最好的数据库设计,但我无法更改。
答案 0 :(得分:1)
给出指定的约束(不幸的是)...
使用UNION ALL
是满足规范的最合适解决方案。
如果我们想要“过去7天”,那么我们(我们的代码)需要弄清楚需要哪些表(相对于需要的表,例如“本月到目前为止”),并动态构造SQL文本
我们首先针对一个表编写查询,进行测试。
SELECT t.fee
, t.fi
, t.fo
, t.fum
FROM sales_data_20190128 t
WHERE t.foo = ?
然后,我们仅对可能包含我们感兴趣的行的每个表重复该查询,排除我们确定不会包含我们想要的行的表,然后将查询与UNION ALL
set运算符组合。
如果需要整个集合有序,则将每个SELECT包裹在括号中,并以ORDER BY子句结尾。例如
( SELECT t.fee, t.fi, t.fo, t.fum
FROM sales_data_20190124 t
WHERE t.foo = ?
)
UNION ALL
( SELECT t.fee, t.fi, t.fo, t.fum
FROM sales_data_20190125
WHERE t.foo = ?
)
UNION ALL
( SELECT t.fee, t.fi, t.fo, t.fum
FROM sales_data_20190126 t
WHERE t.foo = ?
)
UNION ALL
( SELECT t.fee, t.fi, t.fo, t.fum
FROM sales_data_20190127 t
WHERE t.foo = ?
)
UNION ALL
( SELECT t.fee, t.fi, t.fo, t.fum
FROM sales_data_20190128 t
WHERE t.foo = ?
)
ORDER BY 1,2
不要不要尝试通过创建将所有表连接在一起的视图来简化代码,并对此进行查询。不要那样做。