1

センサーからの履歴データを含む、それぞれが同じ構造を持つ 500 以上のテーブルを持つデータベースがあります。たとえば、センサー n が x を超えるすべてのインスタンスを検索するクエリを作成しようとしています。問題は、テーブルが動的であることです。クエリはテーブルのリストを動的に取得できなければなりません。

次のように、information_schema.tables にクエリを実行して、テーブルのリストを取得できます。

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'database_name';

これを使用してプログラムでループを作成し、データベースに繰り返しクエリを実行できますが、MySql に複数のテーブル検索を実行させる方法が必要なようです。

機能するストアド プロシージャを作成することはできませんでしたが、一般的に、任意の列で文字列を検索するための例を見つけることができます。すべてのテーブルに存在する特定の列のデータを具体的に検索したい。ストアド プロシージャを適切に使用する方法も、ストアド プロシージャがこの問題の適切な解決策であるかどうかもわかりません。

ループ内のクエリの例は次のとおりです。

SELECT device_name, sensor_value
FROM device_table
WHERE sensor_value > 10;

以下を試してもうまくいきません。

SELECT device_name, sensor_value
FROM
    (
    SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name'
    )
WHERE sensor_value > 10;

その結果、「すべての派生テーブルには独自のエイリアスが必要です」というエラーが発生します。

目標は、特定のセンサー値を持つすべてのデバイスのリストをログ (テーブル) の任意の場所に作成することです。

最終的に、テーブルのリストを取得したら、プログラムをループするだけでよいですか、それともより効率的なクエリ構造がありますか?

4

3 に答える 3

1

次のように、すべてのテーブルをループして単一のクエリを動的に作成できます。

SELECT device_name, sensor_value FROM device_table WHERE sensor_value > 10
UNION
SELECT device_name, sensor_value FROM device_table2 WHERE sensor_value > 10
UNION
SELECT device_name, sensor_value FROM device_table3 WHERE sensor_value > 10;
于 2009-12-15T20:17:58.913 に答える
0

ストアド プロシージャを作成する必要があります。各レコードを通過するループカーソルが必要です

SELECT table_name FROM information_schema.tables WHERE table_schema = 'データベース名';

そして、jbochi が提供するような長い SQL ステートメントを作成する必要があります。

@Statement = CONCAT(@Statement, " UNION SELECT device_name, sensor_value FROM " , @table_name , " WHERE sensor_value > 10 ");

大きなクエリが構築されたら、それを実行します

PREPARE stmt FROM @Statement;

EXECUTE ステートメント;

DEALLOCATE PREPARE stmt;

注: ループ カーソルの実行方法がよくわかりません。申し訳ありません。

于 2009-12-15T21:40:38.633 に答える
0

最終的にこの問題を解決するために、別のテーブルから結果を取得し、コードでループと比較を行います。その後、すべてのセンサー データを 1 つのテーブルに結合し、以前は欠落していたインデックスを使用してそのテーブルを最適化することがより効率的になりました。

この話の教訓は、適切なテーブル構造が、多くのコーディングの頭痛の種を取り除く鍵となるということです!

于 2010-05-04T19:16:45.080 に答える