mysql查询从3种类型获取项目

mysql查询从3种类型获取项目,sql,mariadb,sql-order-by,greatest-n-per-group,window-functions,Sql,Mariadb,Sql Order By,Greatest N Per Group,Window Functions,我有一个mysql表,有3种数据类型:文本、图像、视频$type列保存数据类型。类型=1表示文本,2表示图像,3表示视频 以前,我只是从它的位置得到18条记录 SELECT * FROM tbl_news WHERE news_status=1 AND show_timeline = 1 ORDER BY position DESC LIMIT $start, 18 现在我的要求是需要从表中获得18条记录,如它应该有6个文本,6个图像和6个视频与分页支持 输出应该是 文本、图像、视频、文本、图

我有一个mysql表,有3种数据类型:文本、图像、视频$type列保存数据类型。类型=1表示文本,2表示图像,3表示视频

以前,我只是从它的位置得到18条记录

SELECT * FROM tbl_news WHERE news_status=1 AND show_timeline = 1 ORDER BY position DESC LIMIT $start, 18
现在我的要求是需要从表中获得18条记录,如它应该有6个文本,6个图像和6个视频与分页支持

输出应该是
文本、图像、视频、文本、图像、视频、文本、图像、视频、文本、图像、视频、文本、图像、视频、文本、图像、视频

如果您运行的是MySQL 8.0,您可以使用窗口功能来实现此目的:

select *
from (
    select n.*, row_number() over(partition by type order by position desc) rn 
    from tbl_news n
    where news_status = 1 and show_timeline = 1 
) n
where rn <= 5
order by rn, type
在早期版本中,一种效率相当低的方法使用子查询:

select n.*
from tbl_news n
where 
    news_status = 1 
    and show_timeline = 1 
    and (
        select count(*) 
        from tbl_news n1 
        where 
            n1.type = n.type 
            and n1.news_status = n.news_status 
            and n1.show_timeline = n.show_timeline
            and n1.position <= n.position
    ) <= 5

我的服务器版本:10.1.44-MariaDB-0ubuntu0.18.04.1-ubuntu18。04@binuj-10.2有行号等。升级时间。@binuj:直到您升级。。。我用早期版本的解决方案更新了我的答案。