2011-11-15 16 views
0

私のタイトルが理にかなっているかどうか分からないので、私の説明が私の湖のタイトルを補うことができれば幸いです。1つのクエリの別のテーブルの名前として1つのテーブルの行の値を使用する方法はありますか。

私は私のテーブルに関する一般的な情報、行数、平均長、データ長を返す単一のクエリを作成したい

、分(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> 

はまた、私は彼らの最小/最大ID値を取得するには、テーブルごとにMIN()MAX()関数を使用する方法を知っています。 (私のテーブルの3つすべてにidという名前の列があります)。私はこの1クエリを作成する方法がわからないしかし

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での結果の全てます。

質問が1つありますが、event_logテーブルにINFORMATION_SCHEMA.PARTITIONSテーブルに関連するフィールドがあるので、event_logの各行をINFORMATION_SCHEMA.PARTITIONSテーブルの行に結びつけることができますか?

+0

悲しいことに、これはevent_logに対してのみ機能し、3つすべてではなく1つの行を返します。私は、 'INFORMATION_SCHEMA.PARTITIONS、event_log、event_log_policy_entries、event_log_policy_status]になるように' FROM '行を変更して拡張しようとしましたが、 "ERROR 1052(23000):フィールドリストの' id '列が曖昧です" –

+0

! INFORMATION_SCHEMA.PARTITIONSとINFORMATION_SCHEMA.PARTITIONSのTABLE_NAME列以外のevent_log表との間には関係がありません。MAX(ID)値を取得しようとしている表の名前です。 –

関連する問題