如何使用联合 table 限制子查询 [MySQL]
How can I limit a subquery [MySQL] with union table
我有以下 tables:
product_category(并集table)
product_category_id (PK AI)
product_id
category_id
类别
category_id (PK AI)
标题
...等等
产品
product_id (PK AI)
标题
命令
等...
我想通过联合 table (product_category) 获取所有类别及其相关产品,并将他们的产品限制为每个类别 5 个,基本上是 many-to-many 关系,例如 netflix 类别轮播(戏剧类别有 5 部相关电影,恐怖类别有 5 部相关电影等...)我试过了,但加入没有像我预期的那样工作:
SELECT
*
FROM
product_category AS pc
INNER JOIN
categories AS cat ON cat.category_id = pc.category_id
INNER JOIN
(SELECT
*
FROM
products
LIMIT 1 ORDER BY products.order DESC) AS x ON x.product_id = pc.product_id;
所以... ¿如何限制每个类别的产品?我正在使用 MySQL 5.7
我不想多次查询数据库以按类别手动获取产品,我想以最干净的方式完成这项工作,最多只需要查询一两个。可能吗?
此致。
在 MySQL 5.7 上,您可以按照这些思路进行尝试,使用内部联接来限制具有最新 order
值的产品:
SELECT *
FROM product_category AS pc
INNER JOIN categories AS cat ON cat.category_id = pc.category_id
INNER JOIN products AS p ON p.product_id = pc.product_id
INNER JOIN
(
SELECT product_id, MAX(`order`) AS latest_order
FROM products
GROUP BY product_id
) p2
ON p2.product_id = p.product_id AND
p2.latest_order = p.`order`;
连接到上面别名为 p2
的子查询仅限于具有最新 order
值的产品记录。旁注:请避免 命名您的列ORDER
,这是保留MySQL 关键字。
编辑: 每个订单前 5 名产品的解决方案,按最近的顺序排列,使用 ROW_NUMBER
:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY p.product_id ORDER BY `order` DESC) rn
FROM product_category AS pc
INNER JOIN categories AS cat ON cat.category_id = pc.category_id
INNER JOIN products AS p ON p.product_id = pc.product_id
)
SELECT *
FROM cte
WHERE rn <= 5;
我有以下 tables:
product_category(并集table) product_category_id (PK AI) product_id category_id
类别 category_id (PK AI) 标题 ...等等
产品 product_id (PK AI) 标题 命令 等...
我想通过联合 table (product_category) 获取所有类别及其相关产品,并将他们的产品限制为每个类别 5 个,基本上是 many-to-many 关系,例如 netflix 类别轮播(戏剧类别有 5 部相关电影,恐怖类别有 5 部相关电影等...)我试过了,但加入没有像我预期的那样工作:
SELECT
*
FROM
product_category AS pc
INNER JOIN
categories AS cat ON cat.category_id = pc.category_id
INNER JOIN
(SELECT
*
FROM
products
LIMIT 1 ORDER BY products.order DESC) AS x ON x.product_id = pc.product_id;
所以... ¿如何限制每个类别的产品?我正在使用 MySQL 5.7 我不想多次查询数据库以按类别手动获取产品,我想以最干净的方式完成这项工作,最多只需要查询一两个。可能吗?
此致。
在 MySQL 5.7 上,您可以按照这些思路进行尝试,使用内部联接来限制具有最新 order
值的产品:
SELECT *
FROM product_category AS pc
INNER JOIN categories AS cat ON cat.category_id = pc.category_id
INNER JOIN products AS p ON p.product_id = pc.product_id
INNER JOIN
(
SELECT product_id, MAX(`order`) AS latest_order
FROM products
GROUP BY product_id
) p2
ON p2.product_id = p.product_id AND
p2.latest_order = p.`order`;
连接到上面别名为 p2
的子查询仅限于具有最新 order
值的产品记录。旁注:请避免 命名您的列ORDER
,这是保留MySQL 关键字。
编辑: 每个订单前 5 名产品的解决方案,按最近的顺序排列,使用 ROW_NUMBER
:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY p.product_id ORDER BY `order` DESC) rn
FROM product_category AS pc
INNER JOIN categories AS cat ON cat.category_id = pc.category_id
INNER JOIN products AS p ON p.product_id = pc.product_id
)
SELECT *
FROM cte
WHERE rn <= 5;