2017-02-09 4 views
0

一般的な情報と私のアプリケーションを使用するすべての企業の情報を含む中央データベースを持つアプリケーションがあります。2つのデータベースに1つの名前が含まれているときに結合する

ので、データベース1はmainで、引数のために、次のようになり、テーブルusersあります

id | name | api_key | databasename 
1 | Company1 | 12345678 | user_data_1 

したがって、データベース2をuser_data_1という名前で、次のようになります。

id | name | password | more things... 
1 | My Name | abc123 | .... 

これを書くと、これらのデータベースに参加して会社とユーザーのデータを1回で取得できます:

SELECT d2.name as username, d1.* 
FROM main.users d1, user_data_1.users d2 
WHERE d1.`api_key`='12345678' AND d2.password='abc123' 

今、私はできることを示唆するものが見つからないので、答えは「いいえ」と確信していますが、最初の行から2番目のデータベースの名前を動的に取得し、 (d1.databasename)は、第2のSQLにおけるapi_keyカラムによって最初のデータベースで見つかった行から第二のデータベースの名前を取得しようとする試みである

SELECT d2.name as username, d1.* 
FROM main.users d1, **(d1.databasename)**.users d2 
WHERE d1.`api_key`='12345678' AND d2.password='abc123' 

+1

あなたはおそらく、動的SQLでこれを行うが、あなたのことができます実際にこれを行う必要がある場合は、デザインに問題がある可能性があります。 –

+0

Hmm ..私は本当にこれを行う必要はありません。ラウンドがありますが、一度に2ビットのデータを取得するヒットメソッドのように思えます。 –

答えて

0

動的ではない純粋なSQLで、最初

の行から2番目のデータベースの名前を取得する方法はあります。純粋なSQLは、データベース、テーブル、または列の名前のシンボル置換を許可しません。

SQLを生成するプログラムを作成する必要があります。それはあなたのプログラムは、通常のクエリの束を発行する前に、SQL文

USE user_data_1; 

を生成することと同じくらい簡単かもしれません。あなたの例で...

USE user_data_1; 

SELECT d2.name as username, d1.* 
    FROM main.users d1, users d2 
WHERE d1.`api_key`='12345678' AND d2.password='abc123'; 

usersへの参照は、データベース名では不適格であることに注意してください。つまり、最新のUSEに記載されているデータベースに由来します。

(あなたがいる場合あなたが本当にプレーンテキストでパスワードを保存していない、あなたは?している、あなたはcybercrooksにセットアップが脆弱作っている。)

+0

パスワードは暗号化されています! :-) –

+0

これは良いですが、依然としてUSEにデータベースを取得してから結合されたクエリを実行する2つの手順が必要です。しかし、それはきちんとしている。 –

関連する問題