php - 从每个类别中选择最近 3 条新闻 - 两个表 - (MySQL - PHP)

标签 php mysql greatest-n-per-group

我想从两个表中选择每个类别的最后 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

关于php - 从每个类别中选择最近 3 条新闻 - 两个表 - (MySQL - PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391702/

相关文章:

mysql - 通过自连接从表中获取最新记录

php - 如何检查 PHP 是否已经连接到数据库?

PHP:\Exception 或命名空间内的异常

php - 哪种方法是提高服务器效率/减少工作负载的最佳方法

sql - 按外键分组时使用 MAX(id) 获取整行的有效方法

MySQL 为其中的每个 id 获取最新的 3 行

php - IF 语句需要以一定的宽度显示文本并且只在主页上显示

mysql - OR 在 django 数据库查询中

php - Codeigniter 在 MySQL 中插入多维数组作为行

mysql - 如何永久解决 MySQL 错误 2002 (HY000)