0

データベース A、テーブル A (AA) からのクエリに、ユーザー ID の配列があります。

データベース B、テーブル A (BA) にメイン ユーザー データベースがあります。

AA からの結果配列で返された各ユーザー ID について、BA からそのユーザー ID の姓名を取得したいと考えています。

異なるユーザー アカウントが各データベースを制御します。残念ながら、各ログインが各データベースへのアクセス許可を持つことはできません。

質問: 最小限のクエリ数および/または処理時間で最初と最後を取得するにはどうすればよいですか? アレイに 20 人のユーザーがいますか? アレイに 20,000 人のユーザーがいますか? 該当する場合、桁違いに高いですか?

php 5 / mysql 5を使用しています。

4

2 に答える 2

2

データベースが同じサーバー上にある限り、クロス データベース結合を使用するだけです。データへのアクセスに使用される DB ログインにも、両方のデータベースに対する権限が必要です。何かのようなもの:

SELECT AA.userID, BA.first, BA.last
FROM databasename.schema.table AA
INNER JOIN databasename.schema.table BA ON AA.userID = BA.userID

コメントへの対応:

複数のログインに関する部分を正しく読んでいるとは思えません。申し訳ありません。1 つの接続で 2 つの異なる MySQL ログインを使用することはできません。複数のクエリを実行する必要がある場合、実際には 3 つのオプションしかありません。A) 最初の結果セットをループして、複数のクエリを実行します。B) userID IN (@firstResultSet) で WHERE 句を使用するクエリを実行し、最初の結果セットを渡します。C) 2 番目の DB からすべてを選択し、それらをコードで結合します。

これら 3 つのオプションはどれもあまり良くないので、2 つの DB のいずれかでユーザー権限を変更できないのはなぜでしょうか? また、なぜ 20,000 人のユーザーの名前と ID を選択する必要があるのでしょうか? これが何らかのタイプのデータ ダンプでない限り、使いやすく、クエリの負荷が少ないデータを表示する別の方法を探しています。

とはいえ、どのオプションを選択するにしても、さまざまな状況に基づいています。レコード数が 1,000 未満の場合は、オプション B を使用します。レコード数が多い場合は、おそらくオプション C を使用し、2 つの結果セットを結合可能なもの (array_combine を使用するなど) に配置しようとします。

于 2009-05-03T07:03:40.250 に答える
0

ここで重要なのは、2 つのデータベース呼び出しで可能であるべきだということだと思います。

最初にデータベース A から ID を取得し、2 番目にデータベース B に渡します。

私はmysqlを知りませんが、sqlserverではxmlデータ型を使用し、それを使用してすべてのIDをステートメントに渡します。xml データ型の前に、IN ステートメントで ID を使用して動的 SQL を構築していました。

DatabaseA.TableA から UserId を選択

ID をループして、カンマ区切りの文字列を作成します。

"SELECT FirstName, Surname FROM DataBaseB.TableA WHERE UserId IN(" + stringId + ")"

これに関する問題は、20,000 の ID を使用すると、送信するデータの量にパフォーマンス上の問題が発生する可能性があることです。これは私が XML データ型を使用する場所なので、id のリストを渡すために mysql が持っている代替手段を見てください。

于 2009-05-03T09:23:11.990 に答える