在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;