0

このようなブリッジテーブルがあります

clients_user_groups
id = int
client_id = int
group_id = int

client_id46lと同じグループに属するクライアントのすべてのclient_idを見つける必要があります

正しい結果を生成する以下のクエリを実行することでそれを達成できます

SELECT client_id FROM clients_user_groups WHERE group_id = (SELECT group_id FROM clients_user_groups WHERE client_id = 46);

基本的に私が知る必要があるのは、2つのクエリまたはより高速な方法を使用せずに同じ結果を達成する方法があるかどうか、または最良の解決策より上の方法であるかどうかです

4

4 に答える 4

0
set @groupID = (SELECT group_id FROM clients_user_groups WHERE client_id = 46);
SELECT client_id FROM clients_user_groups WHERE group_id = @groupID;

グループIDを取得するクエリがあり、それを変数に格納します。この後、group_idが変数に格納されている値と一致するclient_id値を選択します。projects_user_groups.group_idのインデックスを定義すると、このクエリをさらに高速化できます。

注1:コードをテストしていません。タイプミスがないことを願っていますが、あなたは私が思う考えを持っています。

注2:必要な時間を見るとDBリクエストは非常に高額になるため、これは1回のリクエストで行う必要があります。

于 2012-08-29T18:54:47.407 に答える
0

WHERE-clauseサブクエリを使用しています。これは、MySQLでは、テーブル内のすべての行に対して再評価されることになります。JOIN代わりに使用してください:

SELECT a.client_id
FROM   clients_user_groups a
JOIN   clients_user_groups b ON b.client_id = 46
                            AND a.group_id  = b.group_id

将来的に複数のグループを持つクライアントを促進することを計画しているので、切り替えたときに同じものの複数が返されないように追加DISTINCTすることをお勧めします(クライアントが複数のclient_idにある結果として) 46のグループ)。SELECTclient_ids

まだ作成していない場合は、次の複合インデックスを作成します。

(client_id, group_id)

インデックスの最初の位置にclient_idあるのは、初期の選択性が最も高い可能性が高いためです。また、テーブルにかなりの量の行がある場合は、インデックスがで使用されていることを確認してくださいEXPLAIN

于 2012-08-29T18:38:44.267 に答える
0

セルフジョインもお試しいただけます

SELECT a.client_id
FROM   clients_user_groups a
LEFT JOIN clients_user_groups b on b.client_id=46 
Where b.group_id=a.group_id
于 2012-08-29T18:52:20.197 に答える
0

各クライアントは1つのグループにしか属することができないというあなたのコメントに基づいて、group_id関係をフィールドとしてクライアントテーブルに配置するようにスキーマを変更することをお勧めします。通常、説明した種類のJOINテーブルを使用して、リレーショナルデータベース内の多対多の関係を表現します(つまり、クライアントは多くのグループに属し、グループは多くのクライアントを持つことができます)。

このようなシナリオでは、クエリは次のような副選択を必要とせずに行われます。

SELECT c.client_id
FROM clients as c
INNER JOIN clients as c2 ON c.group_id = c2.group_id
WHERE c2.client_id = ? 
于 2012-08-29T19:01:02.977 に答える