Mysql 如何在一个查询中将一个表中的行值用作另一个表的名称?

Mysql 如何在一个查询中将一个表中的行值用作另一个表的名称?,mysql,Mysql,我甚至不知道我的标题是否有意义,所以希望我的解释能弥补我在标题上的不足 我想创建一个查询,返回有关我的表、行计数、平均长度、数据长度、最小(id)和最大(id)值等的一般信息 我知道如何查询信息\u SCHEMA.PARTITIONS以获取“大小”信息。例如: mysql> SELECT TABLE_NAME AS Name, -> TABLE_ROWS as 'Row Count', -> AVG_ROW_LENGTH AS 'Avg Row

我甚至不知道我的标题是否有意义,所以希望我的解释能弥补我在标题上的不足

我想创建一个查询,返回有关我的表、行计数、平均长度、数据长度、最小(id)和最大(id)值等的一般信息

我知道如何查询
信息\u SCHEMA.PARTITIONS
以获取“大小”信息。例如:

mysql> SELECT TABLE_NAME AS Name,
    ->     TABLE_ROWS as 'Row Count',
    ->     AVG_ROW_LENGTH AS 'Avg Row Len',
    ->     DATA_LENGTH,
    ->     ROUND(DATA_LENGTH / 1024 / 1024) AS 'DATA_LENGTH(M)'
    -> 
    -> FROM INFORMATION_SCHEMA.PARTITIONS
    -> 
    -> WHERE (TABLE_NAME    = 'event_log'
    ->        OR TABLE_NAME = 'event_log_policy_entries'
    ->        OR TABLE_NAME = 'event_log_policy_status');
+--------------------------+-----------+-------------+-------------+----------------+
| Name                     | Row Count | Avg Row Len | DATA_LENGTH | DATA_LENGTH(M) |
+--------------------------+-----------+-------------+-------------+----------------+
| event_log                |  10000089 |         182 |  1822425088 |           1738 |
| event_log_policy_entries |  10000137 |         171 |  1710227456 |           1631 |
| event_log_policy_status  |  10000094 |         244 |  2449473536 |           2336 |
+--------------------------+-----------+-------------+-------------+----------------+
3 rows in set (0.57 sec)

mysql> 
此外,我知道如何在每个表的基础上使用
MIN()
MAX()
函数来获取它们的最小/最大ID值。(我的三个表都有一个名为id的列)

但是,我不知道如何进行一次查询。我的目标是创建一个表,如下所示:

+--------------------------+-----------+-------------+-------------+----------------+-----+-----+
| Name                     | Row Count | Avg Row Len | DATA_LENGTH | DATA_LENGTH(M) | Min | Max |
+--------------------------+-----------+-------------+-------------+----------------+-----+-----+
| event_log                |  10000089 |         182 |  1822425088 |           1738 |   # |   # |
| event_log_policy_entries |  10000137 |         171 |  1710227456 |           1631 |   # |   # |
| event_log_policy_status  |  10000094 |         244 |  2449473536 |           2336 |   # |   # |
+--------------------------+-----------+-------------+-------------+----------------+-----+-----+
mysql> SELECT TABLE_NAME AS Name,
    ->     AVG_ROW_LENGTH AS 'Avg_Row_Size',
    ->     DATA_LENGTH AS 'Table_Size',
    ->     INDEX_LENGTH AS 'Index_Size',
    ->     elog.Min,
    ->     elog.Max
    -> 
    -> FROM INFORMATION_SCHEMA.PARTITIONS AS isp
    -> 
    -> LEFT JOIN
    ->   (SELECT 'event_log' AS 'Name',
    ->           MIN(id) AS 'Min',
    ->           MAX(id) AS 'Max'
    ->    FROM event_log
    ->    UNION
    ->    (SELECT 'event_log_policy_entries' AS 'Name',
    ->            MIN(id) AS 'Min',
    ->            MAX(id) AS 'Max'
    ->     FROM event_log_policy_entries)
    ->     UNION
    ->     (SELECT 'event_log_policy_status' AS 'Name',
    ->             MIN(id) AS 'Min',
    ->             MAX(id) AS 'Max'
    ->      FROM event_log_policy_status)) AS elog ON (elog.Name = isp.TABLE_NAME)
    -> 
    -> WHERE (isp.TABLE_NAME    = 'event_log'
    ->        OR isp.TABLE_NAME = 'event_log_policy_entries'
    ->        OR isp.TABLE_NAME = 'event_log_policy_status');
+--------------------------+--------------+------------+------------+------+---------+
| Name                     | Avg_Row_Size | Table_Size | Index_Size | Min  | Max     |
+--------------------------+--------------+------------+------------+------+---------+
| event_log                |          182 | 1822425088 |          0 |   11 | 9999999 |
| event_log_policy_entries |          170 | 1709178880 |  137019392 |   33 | 9999999 |
| event_log_policy_status  |          244 | 2448392192 |  137019392 |  132 | 9999999 |
+--------------------------+--------------+------------+------------+------+---------+
3 rows in set (0.56 sec)

mysql> 
我一直在阅读关于表联接和子查询的文章,但我还没有弄明白这一点。(我假设这可以通过一个查询完成)。

试试这个:

mysql> SELECT TABLE_NAME AS Name,
    ->     TABLE_ROWS as 'Row Count',
    ->     AVG_ROW_LENGTH AS 'Avg Row Len',
    ->     DATA_LENGTH,
    ->     ROUND(DATA_LENGTH / 1024 / 1024) AS 'DATA_LENGTH(M)',
    ->     MIN(id) AS 'Min', MAX(id) AS 'Max'
    -> 
    -> FROM INFORMATION_SCHEMA.PARTITIONS, event_log
    -> 
    -> WHERE (TABLE_NAME    = 'event_log'
    ->        OR TABLE_NAME = 'event_log_policy_entries'
    ->        OR TABLE_NAME = 'event_log_policy_status');
它将从INFORMATION_SCHEMA.PARTITIONS返回筛选的结果,并从event_log返回所有结果


但我有一个问题,事件日志表中是否有一个字段可以与信息SCHEMA.PARTITIONS表关联,以便您可以将事件日志的每一行绑定到信息SCHEMA.PARTITIONS表中的一行?

一位不是堆栈溢出用户的同事向我介绍了一个示例,然后我将其推断为:

+--------------------------+-----------+-------------+-------------+----------------+-----+-----+
| Name                     | Row Count | Avg Row Len | DATA_LENGTH | DATA_LENGTH(M) | Min | Max |
+--------------------------+-----------+-------------+-------------+----------------+-----+-----+
| event_log                |  10000089 |         182 |  1822425088 |           1738 |   # |   # |
| event_log_policy_entries |  10000137 |         171 |  1710227456 |           1631 |   # |   # |
| event_log_policy_status  |  10000094 |         244 |  2449473536 |           2336 |   # |   # |
+--------------------------+-----------+-------------+-------------+----------------+-----+-----+
mysql> SELECT TABLE_NAME AS Name,
    ->     AVG_ROW_LENGTH AS 'Avg_Row_Size',
    ->     DATA_LENGTH AS 'Table_Size',
    ->     INDEX_LENGTH AS 'Index_Size',
    ->     elog.Min,
    ->     elog.Max
    -> 
    -> FROM INFORMATION_SCHEMA.PARTITIONS AS isp
    -> 
    -> LEFT JOIN
    ->   (SELECT 'event_log' AS 'Name',
    ->           MIN(id) AS 'Min',
    ->           MAX(id) AS 'Max'
    ->    FROM event_log
    ->    UNION
    ->    (SELECT 'event_log_policy_entries' AS 'Name',
    ->            MIN(id) AS 'Min',
    ->            MAX(id) AS 'Max'
    ->     FROM event_log_policy_entries)
    ->     UNION
    ->     (SELECT 'event_log_policy_status' AS 'Name',
    ->             MIN(id) AS 'Min',
    ->             MAX(id) AS 'Max'
    ->      FROM event_log_policy_status)) AS elog ON (elog.Name = isp.TABLE_NAME)
    -> 
    -> WHERE (isp.TABLE_NAME    = 'event_log'
    ->        OR isp.TABLE_NAME = 'event_log_policy_entries'
    ->        OR isp.TABLE_NAME = 'event_log_policy_status');
+--------------------------+--------------+------------+------------+------+---------+
| Name                     | Avg_Row_Size | Table_Size | Index_Size | Min  | Max     |
+--------------------------+--------------+------------+------------+------+---------+
| event_log                |          182 | 1822425088 |          0 |   11 | 9999999 |
| event_log_policy_entries |          170 | 1709178880 |  137019392 |   33 | 9999999 |
| event_log_policy_status  |          244 | 2448392192 |  137019392 |  132 | 9999999 |
+--------------------------+--------------+------------+------------+------+---------+
3 rows in set (0.56 sec)

mysql> 
它似乎与没有最小/最大值的原始查询一样快。我使用
SELECT
UNION
创建了一个子表,其中包含名称和最小/最大值,然后将其与信息\u SCHEMA.PARTITION table\u名称中的结果合并


有更好的方法吗?这是可行的,我很高兴能弄明白这一点。但是有更好的方法吗?

遗憾的是,这只适用于事件日志,返回一行而不是全部三行。我试图通过将“FROM”行更改为[INFORMATION_SCHEMA.PARTITIONS,event_log,event_log_policy_entries,event_log_policy_status],来扩展此功能,但失败的消息是“ERROR 1052(23000):field list中的列“id”不明确”哦!除信息模式中的列表名称外,信息模式分区和事件日志表之间没有关系。分区是我试图获取其最大(id)值的表的名称。