mysql多个相似的表查询[似乎不重复]

时间:2019-01-29 14:35:17

标签: mysql

我有一个使用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多个记录。

它可能不是最好的数据库设计,但我无法更改。

1 个答案:

答案 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

不要不要尝试通过创建将所有表连接在一起的视图来简化代码,并对此进行查询。不要那样做。