1

一部のソフトウェア ライブラリによって自動的に生成される次のクエリを理解しようとしています。

SELECT DISTINCT `t`.* FROM `teacher` AS `t` 
LEFT JOIN `rel` AS `rel_profile` 
    ON `rel_profile`.`field_id` = 2319 AND `rel_profile`.`item_id` = `t`.`id` 
LEFT JOIN `teacher_info` AS `profile` 
    ON `profile`.`id` = `rel_profile`.`related_item_id` 
LEFT JOIN `rel` AS `rel_profile_city` 
    ON `rel_profile_city`.`field_id` = 2320 AND `rel_profile_city`.`item_id` = `profile`.`id` WHERE `rel_profile_city`.`item_id` = 1

左結合は 3 つあります。1枚目と2枚目は分かります。私が理解していないのは、3 番目の左結合です。

LEFT JOIN `rel` AS `rel_profile_city` 
    ON `rel_profile_city`.`field_id` = 2320 AND `rel_profile_city`.`item_id` = `profile`.`id` WHERE `rel_profile_city`.`item_id` = 1

テーブルrelは、最初の左結合で既に使用されています。

LEFT JOIN `rel` AS `rel_profile` 
    ON `rel_profile`.`field_id` = 2319 

ここで、同じテーブルが再度結合されたままになりますが、今回は結合されたフィールドの値が異なります。

LEFT JOIN `rel` AS `rel_profile_city` 
    ON `rel_profile_city`.`field_id` = 2320 

この 2 つの結合が矛盾しないのはなぜですか?

4

3 に答える 3

2

クエリはエイリアスを使用しています:

`rel` AS `rel_profile`

relテーブルが実際には という名前のテーブルであるふりをすると言いrel_profileます。そのエイリアスは、クエリの残りの部分で使用されます。MySQL についてはわかりませんが、他のいくつかのデータベース システムでは、relそれ以降 (*) (テーブルを再導入し、エイリアスを提供しない別の結合がない限り) テーブルを参照するのはエラーです。

また、名前 (またはエイリアス) が一意であれば、同じテーブルに複数回参加することができます。これは、同じテーブルの複数の行の内容に依存する結果を作成しようとしていて、結果が 1 つの行を占める必要がある場合に便利です。


(*) 「それ以降」は、テキストの順序ではなく、節が処理される順序です。たとえば、エイリアスをSELECT句で使用する必要があります。これは、テキスト上では前に発生しますが、(概念的には)FROM句の後に処理されるためです。

于 2013-01-28T15:16:06.453 に答える
1

互いに「矛盾」していません。ユーザーの人口統計データと個人データを含むユーザーのテーブルがあるとします。そして、ユーザー間の「関係」を持つ別のテーブル。したがって、この「関係」テーブルには、列UserId1とがありますUserId2。これら 2 人のユーザーのデータを返すクエリが必要な場合は、各列に 1 回JOINS、 tableで2 回実行する必要があります。これは、それらが互いに矛盾しているという意味ではありません。UsersUser

于 2013-01-28T15:05:18.903 に答える
1

このクエリは、OR で行が関連付けられている行を表示teacherますrelfield_id = 2319 field_id = 2320

于 2013-01-28T15:01:45.337 に答える