【问题标题】:How to do JOIN query and not ignore records with NULL values?如何进行 JOIN 查询而不忽略具有 NULL 值的记录?
【发布时间】:2018-06-23 21:04:28
【问题描述】:

我的 Postgres 数据库中有 3 个表:

用户

 Column |         Type          
--------+-----------------------
 id     | integer               
 name   | character varying(50)

产品

   Column    |         Type          
-------------+-----------------------
 id          | integer               
 name        | character varying(50) 
 user_id     | integer               
 category_id | integer 

分类

 Column |         Type          
--------+-----------------------
 id     | integer               
 name   | character varying(50)

用户数据示例

id | name
---+------
1  | John
2  | Sara

产品中的示例数据

id | name           | user_id | category_id
---+----------------+---------+------------
1  | iPhone 8       | 1       | 1
2  | MacBook        | 1       | 2
3  | Fidget Spinner | 1       | NULL
4  | Dell XPS       | 1       | 2
5  | Samsung S8     | 2       | 1

类别中的示例数据

id | name
---+-----------
1  | Mobile Phones
2  | Laptops
3  | Toys

我的 Rails 项目中有一条路线,我希望这条路线的操作返回如下结果:

[
   {
      "category":"Mobile Phones",
      "products":[
         {
            "id":1,
            "name":"iPhone 8"
         }
      ]
   },
   {
      "category":"Laptops",
      "products":[
         {
            "id":2,
            "name":"MacBook"
         },
         {
            "id":4,
            "name":"Dell XPS"
         }
      ]
   },
   {
      "category":"Toys",
      "products":[

      ]
   }
]

基本上,当约翰调用这个端点时,他会看到他所有的产品。这里的主要内容是,我想显示所有类别,无论它们是否有产品。

请为此建议最好和最有效的 Rails ActiveRecord 或 SQL 语句。

【问题讨论】:

  • 我会随心所欲地使用左连接
  • 同时指定预期结果,并向我们展示您的查询尝试。

标签: sql ruby-on-rails ruby postgresql join


【解决方案1】:

使用左外连接。它还将返回空值 -

例如,对于表 t1 和表 t2 -

  SELECT *
FROM table1 t1 LEFT OUTER JOIN table2 t2
   ON t1.a = t2.c
ORDER BY t1.a

【讨论】:

  • @Zulhilmi Zainudin:看来您还没有理解这个答案。即使用户在该类别中没有产品,您也需要所有类别。答案是:使用左外连接。困惑的袋鼠只是给了你你需要的查询类型,而不是为你量身定制的查询,可能是因为你没有表现出自己编写查询的任何努力。
【解决方案2】:

如果要获取主/查找表中不存在的记录,则可以使用左/右连接

SELECT *
FROM products AS p
LEFT JOIN users AS u ON u.id = p.user_id
LEFT JOIN categories AS c ON c.id = p.category_id

【讨论】:

    【解决方案3】:

    将用户的产品外联到类别中以获得所有类别:

    select
      c.name as category_name,
      p.id as product_id,
      p.name as product_name
    from categories c
    left join products p on p.category_id = c.id and p.user_id = 1;
    

    【讨论】:

    • 谢谢。这是最接近我想要的。欣赏这个!
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多