【问题标题】:How to find product by 2 properties postgres如何通过 2 个属性 postgres 查找产品
【发布时间】:2022-01-27 22:58:47
【问题描述】:

我是数据库新手

我有 3 个表(例如写列):

  • 产品(ID、标题)
  • 属性(ID、名称、值)
  • ProductProperty (product_id, property_id)

例如我有: 产品

 id:    title: 
 1      "Iphone 12"
 2      "Iphone 13"
 3      "Iphone 11"

房产

 id:    name:                   value:
 1      "Housing materials"     "metal"
 2      "Housing materials"     "glass"

产品属性

 product_id:    property_id:
 1              1
 1              2
 2              1
 2              2
 3              1

所以,iphone 12和iphone 13有两个属性,而iphone 11只有一个 如何选择所有具有 id 1 和 2 属性的 iphone?

我只需要知道我该怎么做,或者也许有人可以给我一个建议,如何设计我的数据库来提出这种请求?

【问题讨论】:

  • 你想只选择同时拥有这两个道具的iphone吗?
  • 我删除了冲突的 DBMS 标签。请为您真正使用的数据库产品添加一个标签。
  • 我想获得所有具有两个特定属性的产品@Anatoly
  • 研究 GROUP BY 和 HAVING

标签: sql node.js sequelize.js


【解决方案1】:

从属性开始。

内部连接到 ProductProperties 两次,每个所需的属性值一次。

因为内连接需要满足所有条件才能返回行,所以这应该只返回产品同时具有这两个属性的东西。

最后,使用 GROUP BY 对结果集进行重复数据删除。

SELECT 
    p.id, p.name
FROM
   Product p
-- Create a join onto ProductProperty specifically discriminating
-- on the product_id and the property_id being 1.
INNER JOIN
   ProductProperty pp1
ON p.id = pp1.product_id
AND pp1.property_id = 1
-- Then create another join, this time looking for
-- matching product_id and a product_id of 2
INNER JOIN
   ProductProperty pp2
ON p.id = pp2.product_id
AND pp2.property_id = 2
-- This *could* produce loads of rows, so ...
-- Dedupe with GROUP BY
GROUP BY
   p.id,
   p.name

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多