选择每个类别的最后 3 条新闻 - 两个表 - (MySQL - PHP)

say*_*you 5 php mysql greatest-n-per-group

我想从两个表中选择每个类别的最后 3 条新闻

first table ' Categories ' & ' news '
Run Code Online (Sandbox Code Playgroud)

类别表

ID_CAT | NAME | PRIORITE
Run Code Online (Sandbox Code Playgroud)

新闻表

ID | ID_CAT | TITLE | THE_NEWS
Run Code Online (Sandbox Code Playgroud)

我尝试在这个 SQL 代码中进行限制,但它只给我所有类别的最后 3 条新闻

SELECT C.PRIORITE, N.* 
  FROM categories C, news N 
 WHERE N.ID_CAT=C.ID_CAT 
   AND C.PRIORITE >1 
ORDER BY N.ID DESC 
LIMIT 3
Run Code Online (Sandbox Code Playgroud)

我尝试获取所有具有PRIORITE > 1(优先级是类别的顺序)的新闻,因此,我想从每个优先级中获​​取 3 条最新新闻。

例子 :

Priorite 2 = get last 3 news
Priorite 3 = get last 3 news 
Run Code Online (Sandbox Code Playgroud)

... ETC

我在互联网上进行了一些搜索,但没有任何效果,有什么解决办法吗?或者我是否需要创建另一个函数来从每个类别获取新闻,并在其参数中发送 ID?

M K*_*aid 3

你可能会得到n号。使用相关子查询获取每个类别的新闻

SELECT *
FROM news n
JOIN categories c ON c.id = n.category_id
WHERE c.priority > 1
AND (
  SELECT COUNT(*)
  FROM news 
  WHERE n.category_id = category_id
  AND n.id <= id
) <= 3; 
Run Code Online (Sandbox Code Playgroud)

演示

或者,如果您使用的是 Mysql 8,那么您可以使用具有公共表表达式的窗口函数,例如

WITH cte AS(
    SELECT *, 
    RANK() OVER (PARTITION BY category_id ORDER BY id DESC ) rnk
    FROM news
    ORDER BY id

)

SELECT *
FROM cte n
JOIN categories c ON c.id = n.category_id
WHERE c.priority > 1
AND rnk <= 3;
Run Code Online (Sandbox Code Playgroud)

演示