如何使用联合 table 限制子查询 [MySQL]

How can I limit a subquery [MySQL] with union table

我有以下 tables:

我想通过联合 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;