在PostgreSQL查询中,如何从联接中的字段筛选结果
我的表格结构如下: 餐馆在PostgreSQL查询中,如何从联接中的字段筛选结果,sql,postgresql,Sql,Postgresql,我的表格结构如下: 餐馆 | id | name | |----|---------| | 1 | The Hut | | 2 | T Burger| 菜肴: | id | name | |----|---------| | 1 | Pizza | | 2 | Caramel | 订单: | id | locatio | |----|---------| | 1 | New York| | 2 | London | _餐厅店面: 在这里,B代表餐馆,A代表菜肴
| id | name |
|----|---------|
| 1 | The Hut |
| 2 | T Burger|
菜肴:
| id | name |
|----|---------|
| 1 | Pizza |
| 2 | Caramel |
订单:
| id | locatio |
|----|---------|
| 1 | New York|
| 2 | London |
_餐厅店面:
在这里,B代表餐馆,A代表菜肴。
一家餐馆可以有很多菜。一道菜只能有一家餐厅
| id | A | B |
|----|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
_订单:
在这里,B代表订单,A代表菜肴。
一道菜可以点很多菜。一道菜可以有很多菜
| id | A | B |
|----|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
我想做的是,从选定的餐厅列表中获取一份菜品列表,并根据订单数量对其进行排序。我试着这样做:
SELECT count(dishOrder.id) as myCount, dish.id, name
FROM "default$default"."Dish" dish
left join "default$default"."_RestaurantDishes" dishRestaurant on dish.id = dishRestaurant."A"
left join "default$default"."_DishOrders" dishOrder on dish.id = dishorder."A"
where "dishRestaurant"."B" in ("1", "2")
group by dish.id order by mycount desc;
但是它给了我一个错误
error:missing FROM表“dish restaurant”
的子句条目。我尝试了许多其他方法,但都没有成功。您遇到了错误:表“dishcreataurant”的子句条目中缺少错误。因为
您在(“1”、“2”)中的编号中使用了双引号,它变成了使用双引号的列名。您必须像(1,2)中的那样更改它
您在选择中也使用了dish.id,name
,但在group by中未使用name
,因此您必须在group by中使用它,如果可以避免,请不要转义标识符。逃逸修复了外壳——奇怪的事情发生了
我怀疑你想要:
select count(*) as myCount, d.id, d.name
from "default$default"."Dish" d left join
"default$default"."_RestaurantDishes" dr
on dr."A" = d.id and
dr."B" in (1, 2) left join
"default$default"."_DishOrders" do
on d.id = do."A"
group by d.id, d.name
order by mycount desc;
注:
- 我简化了表别名,并从查询中定义的别名中删除了双引号
- 如果可以的话,应该从列名中删除双引号
- 我将
d.name
添加回组中。如果d.id
是唯一的,则不需要这样做
- 我使用的是
count(*)
,因此不引用任何列
- 我将筛选条件移动到
on
子句。这将保持左连接
完好无损
一道菜怎么可能只有一家餐厅?它必须是M-to-M关系,你不这么认为吗?@PhamX.Bach以玛格丽塔比萨饼为例,它可以提供多家酒店?如果你认为这是错误的,请纠正我wrong@iamrajshah是的,我没有仔细阅读。顺便说一句,这个条件中的“dish restaurant.”(1,2)
中的“B”将第一个左连接转换为内部连接,因此您可以将左连接的“default$default”.\u RestaurantDishes”
替换为内部连接的“default$default”。\u RestaurantDishes”
。如果确实要使用左连接,则将条件从WHERE移到ON子句中:LEFT JOIN“default$default”。\u restaurantdish“dish restaurant ON dish.id=dish restaurant.A”和“dish restaurant”。(1,2)
中的“B”如果dish.id
是主键,然后按dish.name进行分组是没有意义的,也不是必需的。谢谢您的帮助。但是现在我得到一个错误,表“dishcreataurant”的子句条目中缺少
select count(*) as myCount, d.id, d.name
from "default$default"."Dish" d left join
"default$default"."_RestaurantDishes" dr
on dr."A" = d.id and
dr."B" in (1, 2) left join
"default$default"."_DishOrders" do
on d.id = do."A"
group by d.id, d.name
order by mycount desc;