MySQL在同一查询中是左联接和一些内部联接

时间:2018-12-05 06:13:40

标签: mysql left-join inner-join

我的桌子很少。

  1. 类别
  2. 项目
  3. restaurant_items
  4. 餐厅
  5. new_sponsoreds
  6. 地区

如果我简要解释这些表格,

categories是食物类别。例如:-蛋糕

item就像是食物的子类别。例如:-巧克力蛋糕

restaurant_items是属于特定餐厅的item的一个实例。例如:- ABC餐厅的巧克力蛋糕

restaurants顾名思义就是一家餐馆,而regionsrestaurant所在的区域。

最重要的一个 new_sponsoreds是餐馆在广告中宣传其食品的地方。

runday    | category_id | restaurant_id

2018-12-5 | 23          | 45

new_sponsoreds表表明,我们需要在restaurant_items(其中餐厅ID为45的category_id为23)上投放广告。

我的使用案例

从给定的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_itemsregion的所有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的{​​{1}}和Item_id以及restaurant_items的其他结果

在这里,第一个记录匹配new_sponsoreds,因为left outer join 12在2018-12-04晋级restuarant_id 25。

第二条记录即使属于同一家餐馆,也不匹配,category_id不等于25。

第三条记录与第一条记录具有相同的category_id。但是它与联接不匹配,因为它属于另一家餐厅。

这是我的预期结果。但是将左联接部分添加到查询后,我什么也没得到。为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

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

正如评论所建议的那样,我将纬度线向上移动了一个,并将此部分添加到了左外部连接处

and new_sponsoreds.restaurant_id = restaurants.Restaurant_id