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

标签 mysql sql

我有一个名为 app_to_tables 的表,它是应用程序和表名之间的映射,表名大约有 20 个,所以我不能在查询中对它们进行硬编码。 这里为了简单起见,我只放了 2 个表名(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 查询结果: 每个 date 每个 table_name 每个 app_id 的信号数,如下所示:

+--------+------------+------------+-------+
| 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 |
+--------+------------+------------+-------+

我的主要问题是如何选择一个表名,然后动态地(不对查询中的表名进行硬编码)使用该表名来计算信号的数量。

最佳答案

My main trouble is how I can select a table names and then dynamically (without hardcoding the table names in the query) use that table names to count the number of signals.

不幸的是,这在 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 在此线程上给出的解决方案。

关于mysql - sql - 使用动态选择的表名进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946080/

相关文章:

php - 如何从表字段MySQL中的字符串获取部分精确值

SQL 左连接获取匹配记录作为 true 或 false 列

mysql - SQL MYSQL 选择记录排除存在任何重复的行

mysql从字符串字段中获取最大数量

mysql - 如何在保留特定值的同时更新字段?

sql - 在 Postgresql 中从 SELECT 插入多行

mysql - WordPress 数据库 : How to remove a word from all posts

mysql - 根据条件计算记录

php - 多个 PHP mysqli 准备好的语句(INSERT UPDATE SELECT)奇怪的行为

mysql - Django 模型与管理站点相结合