MySQL левое соединение и несколько внутренних соединений в одном запросе - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть несколько таблиц, а именно.

  1. категории
  2. элементы
  3. restaurant_items
  4. рестораны
  5. new_sponsoreds
  6. регионов

Если я кратко объясню эти таблицы,

categories - это категории продуктов питания.Например: - Торт

item походит на подкатегорию для еды.Например: - Шоколадный торт .

restaurant_items - это экземпляр предмета, который принадлежит конкретному ресторану.Например: - Шоколадное пирожное в ресторане ABC .

restaurants, как следует из названия, подразумевает только ресторан, а regions - это область, где restaurant находится по адресу.

НАИБОЛЕЕ ВАЖНО new_sponsoreds - это место, где рестораны рекламируют свои продукты в качестве рекламы.

runday    | category_id | restaurant_id

2018-12-5 | 23          | 45

Эта таблица new_sponsoreds указывает на то, что нам нужно запустить рекламу на restaurant_items, где category_id - 23, в ресторане - 45.

МОЙ ИСПОЛЬЗОВАТЬ СЛУЧАЙ

Получить все restaurant_items из заданного region, а затем отфильтровать их

restaurant_items с помощью category и, наконец, правое внешнее соединение это приводит к new_sponsoreds.

, так что пользователь пищевого приложения может получить restaurant_items от region (НЬЮ-ЙОРК) и отфильтруйте его по category (ТОРТЫ).

Этот запрос предназначен для получения этого restaurant_items.

SELECT restaurant_items.* FROM test2.restaurant_items
inner join items on restaurant_items.item_id = items.Item_id
inner join categories on items.category_id = categories.id
inner join restaurants on restaurant_items.restaurant_id = restaurants.Restaurant_id
where restaurants.region_id = 7 and categories.id = 33

Это отлично работает.Но когда я пытаюсь объединить эти результаты с таблицей new_sponsoreds, например,

SELECT restaurant_items.*,new_sponsoreds.* FROM test2.restaurant_items
inner join items on restaurant_items.item_id = items.Item_id
inner join categories on items.category_id = categories.id
inner join restaurants on restaurant_items.restaurant_id = restaurants.Restaurant_id
left outer join new_sponsoreds on categories.id = new_sponsoreds.category_id
where restaurants.region_id = 7 and categories.id = 33
and new_sponsoreds.runday = current_date()

Этот запрос возвращает пустой набор строк. Но я ожидаю, что этот запрос даст мневсе фильтры restaurant_items из region и category_id, и если ресторан продвигает категорию сегодня, это также будет включать результаты.

id |restaurant_id | Item_id | runday    | category_id | restaurant_id
1  |12            | 23      |2018-12-04 | 25          | 12
2  |12            | 45      |null       | null        | null
3  |15            | 23      |null       | null        | null

Это моя исключенная таблица результатов, где restaurant_id и Item_id из restaurant_items и другие из new_sponsoreds

Здесь первая запись соответствует left outer join, потому что restuarant_id 12 там продвигается category_id 25 в 2018-12-04.

Вторая запись не совпадает, даже если она принадлежит тому же ресторану, она category_id не равна 25.

Третья запись имеет тот же category_id, что и первая запись.Но это не соответствует объединению, потому что оно принадлежит другому ресторану.

Это мои ожидаемые результаты.Но я ничего не получаю после того, как добавил в свой запрос левую часть соединения.Почему это могло произойти?

1 Ответ

0 голосов
/ 06 декабря 2018
SELECT restaurant_items.*,new_sponsoreds.* FROM test2.restaurant_items
inner join items on restaurant_items.item_id = items.Item_id
inner join categories on items.category_id = categories.id
inner join restaurants on restaurant_items.restaurant_id = restaurants.Restaurant_id
left outer join new_sponsoreds on categories.id = new_sponsoreds.category_id
and new_sponsoreds.runday = current_date() and new_sponsoreds.restaurant_id = restaurants.Restaurant_id
where restaurants.region_id = 7 and categories.id = 33

Как и предлагалось в комментарии, я переместил строку lat на одну и добавил эту часть к левому внешнему соединению

and new_sponsoreds.restaurant_id = restaurants.Restaurant_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...