Mysql эксклюзивное левое соединение для отношения «один ко многим»

#mysql #sql

#mysql #sql

Вопрос:

У меня есть эти две таблицы

 facilities
 ---- -------------------------------------- -------------- ------- ------ ------------ ------------ 
| id | name                                 | category     | image | cust | created_at | updated_at |
 ---- -------------------------------------- -------------- ------- ------ ------------ ------------ 
|  1 | Bar                                  | hotel        |       |      | NULL       | NULL       |
|  2 | Minibar in alle Zimmer               | hotel        |       |      | NULL       | NULL       |
|  3 | Snack restaurant                     | hotel        |       |      | NULL       | NULL       |
|  4 | Grillroom                            | hotel        |       |      | NULL       | NULL       |
 ---- -------------------------------------- -------------- ------- ------ ------------ ------------ 
  

таблица — 2

 resortfacilities

 ---- ------ --------------------- --------------------- ------ 
| id | f_id | created_at          | updated_at          | h_id |
 ---- ------ --------------------- --------------------- ------ 
| 42 | 4    | 2016-09-21 13:17:27 | 2016-09-21 13:17:27 |   35 |
| 59 | 1    | 2016-09-22 10:23:27 | 2016-09-22 10:23:27 |   38 |
| 60 | 4    | NULL                | NULL                |   38 |
 ---- ------ --------------------- --------------------- ------ 
  

И я запустил следующий sql

 SELECT
facilities.id,
facilities.`name`,
facilities.image,
resortfacilities.h_id
FROM
facilities
LEFT JOIN resortfacilities ON facilities.id = resortfacilities.f_id
WHERE
resortfacilities.f_id IS NULL AND
facilities.category = 'hotel' OR
resortfacilities.h_id <> 35
  

с ожиданием get получаем следующий результат

  ---- --------------------------- ------- ------ 
| id | name                      | image | h_id |
 ---- --------------------------- ------- ------ 
|  4 | Grillroom                 |       |   38 |
|  2 | Minibar in alle Zimmer    |       | NULL |
|  3 | Snack restaurant          |       | NULL |
 ---- --------------------------- ------- ------ 
  

без значений, которые принадлежат h_id 35 , но в итоге я получаю

  ---- --------------------------- ------- ------ 
| id | name                      | image | h_id |
 ---- --------------------------- ------- ------ 
|  1 | Bar                       |       |   38 |
|  4 | Grillroom                 |       |   38 |
|  2 | Minibar in alle Zimmer    |       | NULL |
|  3 | Snack restaurant          |       | NULL |
 ---- --------------------------- ------- ------ 
  

Могу ли я узнать, как получить этот результат?

Комментарии:

1. Попробуйте заключить выражение resortfacilities в квадратные скобки. f_id РАВНО НУЛЮ, А facilities.category = ‘отель’ ИЛИ resortfacilities . h_id <> 35

2. мне кажется, что ваши данные не нормализованы должным образом. Например, почему created_at встречается в обеих таблицах?

3. Скорее всего WHERE facilities.category = 'hotel' AND ( resortfacilities.f_id IS NULL OR resortfacilities.h_id <> 35)

Ответ №1:

используйте приведенный ниже скрипт (для получения результата, как указано).

 SELECT
 f.id,
 f.`name`,
 f.image,
 r.h_id
FROM
facilities f
LEFT JOIN resortfacilities r ON f.id = f.f_id AND r.h_id <> 35
WHERE f.category = 'hotel' 
  

Комментарии:

1. Проверьте свои псевдонимы