MySql 查询从表中找出前 50% 的记录

Posted

技术标签:

【中文标题】MySql 查询从表中找出前 50% 的记录【英文标题】:MySql Query to find out first 50% of records from a Table 【发布时间】:2020-05-09 12:49:04 【问题描述】:

我正在尝试从 mysql 表用户获取前 50% 的记录。我知道我们可以使用 limit 或 top 来查找它们,但记录的总数不是固定的,因此硬编码 limit 或 top 中的实际数字不会给我前 50% 的记录。我怎样才能做到这一点?

【问题讨论】:

您可以随时搜索 - 例如dba.stackexchange.com/questions/20260/select-top-in-mysql 你的MySql是什么版本的? 【参考方案1】:

如果您运行的是 MySQL 8.0,您可以为此使用窗口函数:ntile() 完全符合您的要求。假设您的订购栏是id

select *
from (select t.*, ntile(2) over(order by id) nt from mytable) t
where nt = 1

在早期版本中,一个选项是用户变量和聚合查询的连接:

select *
from (
    select t.*, @rn := @rn + 1 rn
    fom (select * from mytable order by id) t
    cross join (select @rn := 0) x
    cross join (select count(*) cnt from mytable) c
) t
where rn <= cnt / 2

【讨论】:

【参考方案2】:

Mysql 直接不支持这个。您可以尝试使用两个查询或使用子查询

类似的东西。

    查找总记录数/2

    该值必须在限制子句中应用。

    SET @count = (SELECT COUNT(*)/2 FROM table);

    SET @sql = CONCAT('SELECT * FROM table LIMIT', @count);

【讨论】:

以上是关于MySql 查询从表中找出前 50% 的记录的主要内容,如果未能解决你的问题,请参考以下文章

从表中检索所有不同的记录,如果两个相似的不同记录之间发生任何更改,则需要同时考虑两者。使用选择查询

SQL查询:从表中删除除最新N之外的所有记录?

Sqoop 导入查询以从表中传输 1000 条随机记录?

MySQL查询从表中提取两条信息

查询效率 - 从表中选择 2 个最新的“组/批次”记录

从表中删除雇员名字相同的员工记录(需要最少保留一条记录)