【问题标题】:Inner Join condition内连接条件
【发布时间】:2020-11-03 04:20:33
【问题描述】:

我有两个表“cats_lables”和“classified_cats”,在“cats_lables”表中我只能添加一个新的猫类/标签。然后我可以使用这个类/标签对新猫进行分类并将它们添加到“分类猫”表中。

所以表格是这样的:

cats_lables: 

id   cats_lable
1     Polydactyl
2     Snowshoe
3     Calico


classified_cats:

id   class_id   cat_age    placeOfBorn   cat_price 
1          1     3 months   Eygipt         1000
2          3     6 months   Lebanon        2000

所以,这是只显示已分类猫的查询:

SELECT "cats_lables".*,
        CAST(COUNT("classified_cats"."class_id") AS int) AS class_count
      FROM "Labels"
      INNER JOIN "classified_cats"
        ON "classified_cats"."class_id"="cats_lables"."id"
      GROUP BY "cats_lables"."id"
      ORDER BY class_count DESC

但我想升级我的查询以显示猫类,即使没有分配给它的猫。

如何解决我的查询问题?

【问题讨论】:

标签: sql database inner-join


【解决方案1】:

左连接应该为您完成。

 SELECT "cats_lables",
        CAST(COUNT("classified_cats"."class_id") AS int) AS class_count
   FROM "Labels"
  LEFT JOIN "classified_cats"
     ON "classified_cats"."class_id"="cats_lables"."id"
  GROUP BY "cats_lables"."id"
  ORDER BY class_count DESC

【讨论】:

    【解决方案2】:

    我建议这样编写查询:

    SELECT l.*, COUNT(cc."class_id") AS class_count
    FROM "Labels" l LEFT JOIN
         "classified_cats" cc
         ON cc."class_id" = l."id"
    GROUP BY l."id"
    ORDER BY class_count DESC;
    

    注意事项:

    • "cats_labels" 不在 FROM 子句中。我假设您的意思是“标签”。
    • 我强烈建议您永远不要在标识符上使用双引号。它们只是使查询更难编写和阅读。
    • 表别名使查询更易于编写和阅读。
    • 您没有指定数据库,但并非所有数据库都支持通过主键进行聚合,然后从表中选择其他列 - 尽管标准允许这样做。

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2023-03-04
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多