如何在 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 中选择包含所有字母和数字的行?的主要内容,如果未能解决你的问题,请参考以下文章