从每个类别中选择最后3个新闻 – 两个表 – (MySQL – PHP)

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

first table ' Categories ' & ' news '

类别表

ID_CAT | NAME | PRIORITE

新闻表

ID | ID_CAT | TITLE | THE_NEWS

我尝试在这个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

我试图获得所有有PRIORITE>的新闻. 1(优先级是类别的顺序)所以,我想从每个优先级获得3个最新消息.

示例:

Priorite 2 = get last 3 news
Priorite 3 = get last 3 news 

……等

我在互联网上搜索了一些,但没有什么对我有用,有什么解决方案吗?或者我是否需要创建另一个函数来从每个类别中获取带有ID参数的新闻?

最佳答案
你可以得到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; 

Demo

或者,如果您使用的是Mysql 8,那么您可以使用window functionscommon table expressions之类的

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;

Demo

转载注明原文:从每个类别中选择最后3个新闻 – 两个表 – (MySQL – PHP) - 代码日志