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

时间:2018-07-17 23:56:28

标签: 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的形式发送其参数?

4 个答案:

答案 0 :(得分: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; 

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

答案 1 :(得分:1)

我建议将其分为2部分,而不是复杂的查询

在第一部分中,您可以获取类别

select * from Categories

然后循环分类并循环获得其3条新闻,

select * from news where cat_id = '' order by desc id limit 3

如果您同时尝试了两者并检查了执行时间,则会发现循环花费的时间更少。因为新闻正在迅速发展。我知道您认为我为什么要一遍又一遍地查询,但是我的老师说我更喜欢多个查询而不是复杂的查询

答案 2 :(得分:0)

尝试此查询,它应该可以工作:

SELECT
    C.PRIORITE, N.*
FROM
    categories C
JOIN news N ON N.ID_CAT=C.ID_CAT
AND C.PRIORITE >1 
GROUP BY
    C.ID_CAT
HAVING
    COUNT(*) <= 3
ORDER BY N.ID DESC

莱姆知道这是否有问题。

答案 3 :(得分:0)

尝试此查询。该查询基于PRIORITE为每个记录生成一个行号。然后返回等于或小于3的行号。

SELECT ID, PRIORITE, THE_NEWS
FROM
(
   SELECT ID, PRIORITE, THE_NEWS  ,
   @rn := IF(@prior = PRIORITE, @rn + 1, 1) AS rn,
   @prior := PRIORITE 
   FROM(
   SELECT t.*,c.PRIORITE FROM news t 
   LEFT JOIN categories c ON t.ID_CAT=c.ID_CAT ) e
   CROSS JOIN (select @rn:=0, @prior:=null) c
   ORDER BY  PRIORITE,ID desc
) as x 
WHERE x.rn <= 3 ;