如何在 MYSQL 中选择包含所有字母和数字的行?

Posted

技术标签:

【中文标题】如何在 MYSQL 中选择包含所有字母和数字的行?【英文标题】:How to select rows with all alphabets and numbers in MYSQL? 【发布时间】:2016-04-05 13:22:22 【问题描述】:

我有一个包含 100000 行的表,其中有一列说 drugname,其类型为 varchar。

列的值可以从 0 到 9 开始,并且 A-Z 或 a-z。

我需要一个返回 25000 行的查询。在这 25000 行中,它应该包含所有的字母和数字。

比如说,

字母 A 包含 500 行 字母 B 包含 500 行 数字 1 包含 400 行 数字 2 包含 300 行等...

包括所有数字和字母,总共应该有 25000 行。

【问题讨论】:

你的意思是:select substring(drugname,1,1) as initial,count(*) from tableName group by substring(drugname,1,1) ??或select substring(drugname,1,1) as initial,count(*) from (select * from tableName limit 25000) A group by substring(drugname,1,1) 每个字母/数字的返回行数是否应该与数据库中的比率相同?即如果 10% 的行包含“Z”,那么这应该是 25000 行的 10% 吗? 你试过什么?请给我们一些代码...***.com/help/how-to-ask 我不确定这就是你想要的...... @RyanVincent 返回的行不必是相同的比率。但应该包含所有的字母和数字。例如只有我告诉了 500 行、400 行等。 【参考方案1】:

首先为所有组选择最小的 id 集(按第一个字符)

select min(id) as substrId
from the_table
group by substr(value,0,1)

然后使用子选择先返回选中的id(代表所有组),然后是一些随机的id

select t1.* 
from the_table t1
    left join (select min(id) as substrId
               from the_table
               group by substr(value,0,1)) sub on t1.id=sub.substrId
order by ifnull(sub.substrId, 0) desc
limit 25000

因此,所有不同的组成员都包含在最终结果集中。

【讨论】:

【参考方案2】:

根据第一个字符枚举行。然后使用枚举获取行:

select d.*
from (select d.*,
             (@rn := if(@l = left(d.drugname, 1), @rn + 1,
                        if(@l := left(d.drugname, 1), 1, 1)
                       )
             ) as seqnum
      from drugs d cross join
           (select @rn := 0, @l := '') params
      order by d.drugname
     ) d
order by seqnum
limit 25000;

注意:这将返回每个字母的药物名称最小的行。如果你想要随机的,那么使用这个order by

order by left(d.drugname, 1), rand()

【讨论】:

以上是关于如何在 MYSQL 中选择包含所有字母和数字的行?的主要内容,如果未能解决你的问题,请参考以下文章

取所有包含数字的行的总和并跳过带有字母的行并将总和写回另一个文件

在pyspark中删除所有包含一个字母的行[重复]

根据包含数字和不包含数字的行对 CSV 中的行进行排序

正则表达式匹配至少包含一定比例数字的行:字母

如何在 laravel 中查询只有字母数字值的行?

过滤“pandas”中所有不包含字母(alpha)的行