2

私は最近、SQLクエリに関してここで質問をしました:複雑なSQL削除クエリの頭を包む問題

私がやろうとしていることは複雑すぎて、結果を間に保つ方法がなければ、単一のクエリや複数のクエリでさえも実行できないことを理解しました。したがって、bashスクリプトを作成することにしました(最終結果はcronjobと関係があるため、bashが最も簡単な選択です)。

次の表を検討してください。

AssociatedClient:

+-----------+-----------------+
| Client_id | Registration_id |
+-----------+-----------------+
|         2 |               2 | 
|         3 |               2 | 
|         3 |               4 | 
|         4 |               5 | 
|         3 |               6 | 
|         5 |               6 | 
|         3 |               8 | 
|         8 |               9 | 
|         7 |              10 | 
+-----------------------------+

私がしたいのは、特定のに関連付けられのリストにあるすべてのを選択することです。Registration_idClient_idClient_id Registration_id

私はSQLにかなり慣れていませんが、このクエリは比較的簡単であることがわかりました。

SELECT `Registration_id` FROM `AssociatedClient` ac1
WHERE ac1.`Client_id` IN
                      (SELECT `Client_id` FROM `AssociatedClient` ac2 
                       WHERE ac2.`Registration_id` = $reg_id);

ここで、$reg_idは単なるbash変数です。

これは機能しますが、特に多くの文字の乱雑さが発生するbashスクリプト内では見栄えがよいため、自己結合で実行されることを望んでいます。私のSQLスキルはそれほど遠くないのではないかと思います。

4

1 に答える 1

2

私が正しく理解していれば、次のような単純な自己結合を実行できるはずです。

SELECT ac1.registration_id
FROM associatedclient ac1
JOIN associatedclient ac2 ON ac2.client_id = ac1.client_id
WHERE ac2.registration_id = $reg_id

つまり、あなたがしているのは、テーブルを1回スキャンし、client_idが一致する場所でテーブルをそれ自体に結合することです。次に、結合された行を、テーブルの2番目のバージョンが特定のIDを持つ行に制限し、1番目のテーブルでの結合のさまざまな順列を残して、それらの行からregistration_idを選択します。

したがって、変数値6の例を考えて、次のステートメントを実行してみてください。

SELECT 
  ac1.client_id AS client_id_1
, ac1.registration_id AS reg_id_1
, ac2.client_id AS client_id_2
, ac2.registration_id AS reg_id_2
FROM associatedclient ac1
JOIN associatedclient ac2 ON ac1.client_id = ac2.client_id

結合の完全なセットに気付くでしょう。WHERE次に、制限を追加して、どの行が戻ってくるかを確認します。次に、最後に必要な列を選択します。

私が設定したSQLFiddleをチェックして、値6でテストできます。

于 2013-02-27T10:33:56.563 に答える