2011-11-15 37 views
0

我甚至不知道我的頭銜是否有意義,所以希望我的解釋能夠彌補我的標題清晰度。如何將一個表中的行值用作一個查詢中另一個表的名稱?

我想創建一個返回關於我的表的一般信息,行數,平均長度,數據長度單個查詢,分(ID)和max(ID)值等

我知道如何查詢INFORMATION_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的列)。

mysql> SELECT MIN(id) AS 'Min', MAX(id) AS 'Max' from event_log; 
+------+---------+ 
| Min | Max  | 
+------+---------+ 
| 0 | 9999999 | 
+------+---------+ 
1 row in set (0.00 sec) 

mysql> 

但是我不知道如何使這個一個查詢。我的目標是將有一個表,如下所示:

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

我一直在閱讀有關表連接和子查詢,但我一直沒能想出解決辦法,但。 (我假設這可以通過一個查詢完成)。

回答

0

一位同事誰不是一個堆棧溢出用戶提到我作爲一個例子,我則推斷爲以下:

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> 

這似乎是一樣快,因爲這並沒有原始查詢有最小值/最大值。我使用了SELECTUNION來創建一個帶有名稱和最小/最大值的子表,然後將它加入到INFORMATION_SCHEMA.PARTITION TABLE_NAME的結果中。

有沒有更好的方法來做到這一點?這是有效的,我覺得搞清楚這一點很好。但是有更好的方法嗎?

0

試試這個:

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結果。

我有一個問題,是否有event_log表中的一個字段可以與INFORMATION_SCHEMA.PARTITIONS表相關聯,以便您可以將event_log的每一行綁定到INFORMATION_SCHEMA.PARTITIONS表中的一行?

+0

不幸的是,這隻適用於event_log,返回一行而不是全部三行。我嘗試通過將'FROM'行更改爲[INFORMATION_SCHEMA.PARTITIONS,event_log,event_log_policy_entries,event_log_policy_status]來擴展它,但是失敗並顯示消息「ERROR 1052(23000):字段列表中的列'id'含糊不清」 –

+0

哦! INFORMATION_SCHEMA.PARTITIONS和INFORMATION_SCHEMA中的TABLE_NAME列以外的event_log表之間沒有關係.PARTITIONS是我試圖獲取MAX(id)值的表的名稱。 –

相關問題