繁体   English   中英

sql - 使用动态选择的表名进行分组

[英]sql - group by using dynamically selected table names

我有一个名为app_to_tables的表,它在应用程序和表名之间进行映射,表名大约为20,因此我无法在查询中对它们进行硬编码。 为简单起见,我只放了两个表名(table_1,table_2)。 表结构如下:

+--------+------------+
 | app_id | table_name |
 +--------+------------+
 |      1 | table_1    |
 |      1 | table_2    |
 |      2 | table_1    |
 |      2 | table_2    |
 +--------+------------+

从另一方面,我有另一个表,名为table_1,table_2,table_3。 这些表的架构是相同的,内容如下:

table_1
+------------+--------+--------+
|    date    | app_id | signal |
+------------+--------+--------+
| 2018-01-01 |      1 | sg     |
| 2018-01-01 |      1 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-02 |      1 | sg     |
| 2018-01-02 |      1 | sg     |
+------------+--------+--------+

table_2
+------------+--------+--------+
|    date    | app_id | signal |
+------------+--------+--------+
| 2018-01-01 |      1 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-01 |      2 | sg     |
| 2018-01-02 |      1 | sg     |
| 2018-01-02 |      2 | sg     |
+------------+--------+--------+

我试图有一个SQL查询结果,如下所示:每个app_id每个table_name每个date的信号数,如下所示:

+--------+------------+------------+-------+
| app_id | table_name |    date    | count |
+--------+------------+------------+-------+
|      1 | table_1    | 2018-01-01 |     2 |
|      1 | table_1    | 2018-01-02 |     2 |
|      1 | table_2    | 2018-01-01 |     1 |
|      1 | table_2    | 2018-01-02 |     1 |
|      2 | table_1    | 2018-01-01 |     2 |
|      2 | table_2    | 2018-01-01 |     3 |
|      2 | table_2    | 2018-01-02 |     1 |
+--------+------------+------------+-------+

我的主要麻烦是如何选择表名然后动态(不对查询中的表名进行硬编码)使用表名来计算信号数。

我的主要麻烦是如何选择表名然后动态(不对查询中的表名进行硬编码)使用表名来计算信号数。

不幸的是,这在SQL中是不可能的。 SQL要求查询在准备查询之前显式地命名所有表。 您无法编写任何动态连接到其他表的SQL查询,具体取决于它在执行期间扫描数据时发现的值。

SQL要求调用某个函数的代码没有意义,它的名称实际上是函数的返回值。 与在PHP中一样,您可以调用名称基于变量的函数。 但你显然无法调用一个函数,其名称是你调用的函数的结果。

$result = $result(); // this is a paradox

您可以做的是根据您在app_to_tables表中找到的不同表生成查询。

SELECT DISTINCT table_name FROM app_to_tables;

这为您提供了一个简短的表名列表(在您的情况下可能大约有20个表)。 然后,您必须编写代码以从此列表中将字符串构建为SQL查询。

基本上就像@ThomasG在这个帖子上给出的解决方案一样。

UNION是你的朋友

SELECT app_id, table_name, date, count(*)
FROM
( 
SELECT 'table_1' AS table_name, date, app_id FROM table_1
UNION ALL
SELECT 'table_2' AS table_name, date, app_id FROM table_2
UNION ALL
SELECT 'table_3' AS table_name, date, app_id FROM table_3
) U
GROUP BY app_id, table_name, date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM