2

現在、メインデータベースを格納するデータベースサーバーがあり、そのデータベース内のテーブルは以下のような構造になっています

company.companyInfo

ID | Name     | databaseName | otherinfo
---+----------+--------------+----------
0  | companyA | databaseA    | Extra1
1  | companyB | databaseB    | Extra2

会社のデータベースは次のとおりです。

データベースA.users

userID | Name    | Password  |  extra
-------+---------+-----------+---------
0      | user1   | pass1     | other1
1      | user2   | pass2     | other2

databaseB も同様です。

私がやりたいのは、ユーザーテーブルの1つからユーザー情報を取得することですが、メインデータベースからリンクすることです

したがって、すべてのユーザーの詳細を取得するためにある種のサブセレクトを行いたいのですが、データベース名を companies.companyInfo テーブル クエリからサブセレクトにフィードします。

私は立ち往生しています..助けてください!

4

1 に答える 1

2

何を求めているのかは完全には明らかではありませんが、原則として、式 (テーブル検索からのフィールドの値を含む) を識別子 (テーブルまたは列の名前など) として使用することはできません。

回避策の 1 つは、目的のクエリを含む文字列からステートメントを「準備」することです。このような文字列は、識別子の代わりに式を連結することで作成できます。

SELECT CONCAT(
  'SELECT * FROM `', REPLACE(databaseName, '`', '``'), '`.users'
) INTO @qry FROM companies.companyInfo WHERE ID = 1;

PREPARE stmt FROM @qry;
EXECUTE stmt;

SELECTただし、アプリケーションで 1 つのクエリを使用してデータベース名を取得し、同じ連結を実行してそこから 2 番目のクエリを発行することは、同じくらい簡単な場合があります。

とはいえ、データ構造をさらに正規化する必要があるのではないでしょうか? すべてのデータベースを 1 つにまとめて、各テーブルの列に各レコードがどの会社に関連しているかを示してみませんか?

于 2012-06-11T09:25:49.833 に答える