【问题标题】:SELECT Where ID in (List of IDs) and limit records of each IDs in MySQLSELECT Where ID in (List of IDs) 并限制MySQL中每个ID的记录
【发布时间】:2020-08-19 12:14:09
【问题描述】:

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

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

但是,这限制了整个结果。我找到了类似SO question 的答案。但是,答案建议对每个 ID 使用循环。这会导致多次 DB 命中。

另一种选择是获取所有记录并将它们分组到代码中。但是,如果有大量记录,这将是沉重的。

如果能在查询级别处理就好了。任何帮助将不胜感激。

注意:这里使用的表格是虚拟表格。

【问题讨论】:

标签: mysql sql


【解决方案1】:

Pre-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 中,可能不需要最里面的子查询。

【讨论】:

  • 这个不错。而且我认为您必须在最后一个 where 子句中使用 rn 而不是 @rn。
  • @Abhishek 。 . .是的。那是一个错字。
  • 我几乎可以肯定 UNIONed 查询会比使用变量更快,但没有那么优雅。
【解决方案2】:

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

(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 的基础上获得 LIMIT。这样的 SQL 可以很容易地从 php 代码中生成。

Nb : mysql 查询中允许的最大 UNION 数为 61。

【讨论】:

  • 这个不错。但是,如果请求中有更多的 ID (storeId),则查询会变得很大。
  • @Abhishek:最多 61 个 UNION。查询很大,但很容易动态生成...
【解决方案3】:

在哪里使用选择

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2023-03-20
    相关资源
    最近更新 更多