sql - 递归选择并连接相关表

标签 sql database postgresql recursive-query

CREATE TABLE IF NOT EXISTS "product_category"(
  "id" SERIAL NOT NULL,
  "parent_id" integer DEFAULT NULL,
  "name" varchar DEFAULT NULL,
  PRIMARY KEY ("id")
);


CREATE TABLE IF NOT EXISTS "product"(
  "id" SERIAL NOT NULL,
  "product_category_id" integer DEFAULT NULL,
  PRIMARY KEY ("id")
);

我有两个像上面那样的表,
product_category 是层次结构,
product.product_category_id fk product_category.id

如何选择特定 product_category id 下的所有产品,

例如
如果输入 product_category 1,
输出 -> 产品:1,产品:2

如果输入product_category 2
输出 -> 产品:2

product_category
id | parent_id | name
1  |           | parent
2  | 1         | child
3  | 2         | child child


product
id | product_category_id
1  | 1
2  | 3

查询

像这样??但是这只返回 product_category 列表....我想要产品列表

WITH RECURSIVE pc AS (
  SELECT pc.id AS id
    FROM product_category pc

    LEFT JOIN product p ON p.product_category_id = pc.id

    WHERE id = $1 

  UNION ALL

  SELECT child.id
    FROM product_category AS child

    LEFT JOIN product p ON p.product_category_id = child.id

    JOIN pc ON pc.id = child.parent_id 
)
SELECT * FROM product_category WHERE id IN (SELECT * FROM pc)

最佳答案

您应该首先建立类别列表,然后将其加入产品。

WITH RECURSIVE pc AS (
  SELECT id
  FROM product_category 
  WHERE id = $id

  UNION ALL

  SELECT child.id
    FROM product_category AS child
    JOIN pc ON pc.id = child.parent_id 
)
SELECT pr.*
FROM product pr
  JOIN pc on pr.product_category_id = pc.id
;

关于sql - 递归选择并连接相关表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39323753/

相关文章:

mysql - SQL查找列数

sql - 仅连接两个表的分区

php - 无法将数据选择插入数据库 php mysql?

PostgreSQL:我应该更改现有索引还是创建新索引?

mysql - 尝试使用加载数据本地文件 SQL 导入 csv 文件并转换为整数

mysql - 在 select 语句中填充字段 - MySQL

SQL Select 用于书籍格式

node.js - 在 Heroku Postgres 中继续迁移 : Chain of errors

sql - 查询适用于 MySQL 而不是 Oracle

php - 从锁定到 ID 的多维数组中获取特定值