sql—选择id所在的位置(id列表)并限制mysql中每个id的记录

mum43rcc  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(307)

我遇到了一种情况,我有一个存储表的ID列表,需要从每个存储中获取最新的10个文件。

SELECT * 
FROM tblFiles 
WHERE storeId in (IDs) 
ORDER BY createdDate DESC  
LIMIT 10

但是,这限制了整个结果。我找到了一个类似问题的答案。但是,答案建议对每个id使用loop,这会导致多个db命中。
另一种选择是获取所有记录并在代码中对它们进行分组。但是,如果有大量的记录,这将是沉重的。
如果可以在查询级别处理,那就太好了。任何帮助都将不胜感激。
注:这里用的是假表。

svmlkihl

svmlkihl1#

在where中使用select

SELECT * from tblFiles where storeId in (SELECT id from store ORDER BY datefield/id field desc limit 10)
zpqajqem

zpqajqem2#

在mysql 8.0之前,最简单的方法可能是变量:

select f.*
from (select f.*,
             (@rn := if(@s = storeId, @rn + 1,
                        if(@s := storeId, 1, 1)
                       )
             ) as rn
      from (select f.*
            from tblfiles f
            where storeId in (IDs) 
            order by storeId, createdDate desc
           ) f cross join
           (select @s := 0, @rn := 0) params
     ) f
where rn <= 10;

在mysql 8+或mariadb 10.3+中,您只需使用窗口函数:

select f.*
from (select f.*,
             row_number() over (partition by storeid order by createdDate desc) as seqnum
      from tblfiles f
     ) f
where seqnum <= 10;

在mysql和mariadb的旧版本中,可能不需要最里面的子查询。

w46czmvw

w46czmvw3#

您可以使用联合查询来解决此问题,其中每个子查询搜索特定的id并强制执行一个限制子句,如:

(SELECT * 
FROM tblFiles
WHERE storeId = ?
ORDER BY createdDate DESC
LIMIT 10)
UNION
(SELECT * 
FROM tblFiles
WHERE storeId = ?
ORDER BY createdDate DESC
LIMIT 10)
...

使用此解决方案,只会发生一次db命中,并且您可以保证在每个id的基础上获得限制。这样的sql可以很容易地从php代码中生成。
注意:mysql查询中允许的最大联合数是61。

相关问题