5

私は次のテーブルを持っています:

CREATE TABLE `accommodations` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) 

CREATE TABLE `accommodations_exclude` (
  `id_accommodation` int(11) unsigned NOT NULL,
  `id_course` int(11) NOT NULL,
  UNIQUE KEY `id_course` (`id_course`,`id_accommodation`)
) 

宿泊施設の表には4つのレコードがあり、accommodations_excludeにはさらに多くのレコードがあります。ここで、accommodationsテーブルのすべてのレコードを常に取得し、追加フィールドとして結合して、accommodations_excludeテーブルにも宿泊施設が存在するかどうかを確認するクエリが必要です。

例えば; 宿泊施設_excludeには、id_accommodation = 2、id_course=16の行が1つあります。

次のような結果セットが必要です。

accommodation.id, accommodation.name, accommodation_exclude.id_accommodation, accommodation_exclude.id_course

1,'acco 1',null,null
2,'acco 2',2,16
3,'acco 3',null,null
4,'acco 4',null,null

私が今持っているクエリはこれです:

SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation 
WHERE ae.id_course = 16

しかし、これは私に結果セットだけを与えます

2,'acco 2',2,16

null値を持つべき宿泊施設ではありません

私がここで間違っていることについて何か考えはありますか?

4

5 に答える 5

9

ae.id_course = 16句をからに移動WHEREしますLEFT JOIN

SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON
    a.id = ae.id_accommodation
    AND ae.id_course = 16

WHERE最終結果セットのフィルターと考える 必要があります。テーブルのリンクに関係することはすべて、JOINの条件である必要があります。

オリジナルWHERE ae.id_course = 16は、結果セットからNULLae.id_course行を除外していました。

于 2013-01-10T09:39:03.497 に答える
1

テーブルを左側のaccommodations_excludeテーブルにするか、RIGHT JOIN代わりに次のように使用します。

SELECT
 a.id, 
 a.name, 
 ae.id_accommodation, 
  ae.id_course
FROM accommodations a
RIGHT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation;

SQLフィドルデモ

これはあなたに与えるでしょう:

| ID |   NAME | ID_ACCOMMODATION | ID_COURSE |
----------------------------------------------
|  1 | acco 1 |           (null) |    (null) |
|  2 | acco 2 |                2 |        16 |
|  3 | acco 3 |           (null) |    (null) |
|  4 | acco 4 |           (null) |    (null) |

注:投稿したサンプルデータの場合、は、を含むWHERE ae.id_course = 161行のみを返しae.id_course = 16ます。

于 2013-01-10T09:39:15.647 に答える
0

それはあなたの状態に基づいてあなたにこれ以上与えることはありません

WHERE ae.id_course = 16

それはあなたに適切な結果セットを与えています。それを削除すると、それらすべてが一覧表示されます。

于 2013-01-10T09:38:45.623 に答える
0
SELECT ACCOMMODATION.ID, ACCOMMODATION.NAME,
       ACCOMMODATION_EXCLUDE.ID_ACCOMMODATION,
       ACCOMMODATION_EXCLUDE.ID_COURSE
  FROM ACCOMMODATION, ACCOMMODATION_EXCLUDE
 WHERE ACCOMMODATION.ID = ACCOMMODATION_EXCLUDE.ID_ACCOMMODATION(+)
       AND ACCOMMODATION_EXCLUDE.ID_COURSE = 16
于 2013-01-10T09:55:31.793 に答える
0

「RossMcNab」からの回答が最適ですが、使用条件がない場合は、次のJOINサンプルコードを使用できます。

SELECT *
FROM accommodations a
LEFT JOIN accommodations_exclude ae ON a.id = ae.id_accommodation 
WHERE ae.id_course = 16 OR ae.id_course IS NULL
于 2014-03-12T06:15:09.133 に答える