首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql最短长度匹配

mysql最短长度匹配
EN

Stack Overflow用户
提问于 2010-06-22 06:18:00
回答 5查看 1.2K关注 0票数 3

我不知道如何解释我想要什么,然后给出一个例子

代码语言:javascript
复制
country                           prefix
Argentina-Mobile                  549
Argentina-Neuquen                 54299
Argentina-Rosario                 54341
Argentina-Salta                   54387
Argentina-Santa Fe                54342
Argentina-Tucuman                 54381
Armenia                           374
Armenia Mobile-K-Telecom          37477
Armenia Mobile-K-Telecom          37493
Armenia Mobile-K-Telecom          37494
Armenia Mobile-K-Telecom          37498
Armenia-Karabakh                  37447
Armenia-Mobile                    37455
Armenia-Mobile                    3749
Armenia-Yerevan                   37410
Aruba                             297
Aruba-Mobile                      29756
Aruba-Mobile                      29759
Aruba-Mobile                      29766
Aruba-Mobile                      29769
Aruba-Mobile                      29796
Aruba-Mobile                      29799
Aruba-Mobile-Digicell             29773
Aruba-Mobile-Digicell             29774
Aruba-Mobile-MIO                  297600
Aruba-Mobile-MIO                  297622
Ascension Island                  247
Australia                         61
Australia-Adelaide/Perth          61861
Australia-Adelaide/Perth          61862
Australia-Adelaide/Perth          61863

我想对前缀运行一个查询,以获得最短父前缀的列表

代码语言:javascript
复制
country                  prefix
Argentina -Mobile        549
Armenia                  374
Aruba                    297
Australia                61
EN

回答 5

Stack Overflow用户

发布于 2010-06-22 08:14:39

这比我想象的要简单。您只需按国家/地区分组,然后使用MIN()

但是,如果每个字段都有一个国家代码列,这会容易得多,而且不容易出错,而不是必须解析国家文本,这可能会导致错误。

代码语言:javascript
复制
SELECT t2.country, MIN(CAST(t1.prefix AS SIGNED)) AS prefix FROM MyTable t1
LEFT JOIN MyTable t2
ON t2.prefix = t1.prefix
GROUP BY
  IF(
     INSTR(t1.country, ' mobile') = 0 AND INSTR(t1.country, '-') = 0,
     t1.country,
     IF(
        INSTR(t1.country, ' mobile') > 0 AND INSTR(t1.country, '-') > 0,
        IF(
           INSTR(t1.country, ' mobile') > INSTR(t1.country, '-'),
           LEFT(t1.country, INSTR(t1.country, '-') - 1),
           LEFT(t1.country, INSTR(t1.country, ' mobile') - 1)
          ),
        IF(
           INSTR(t1.country, ' mobile') > INSTR(t1.country, '-'),
           LEFT(t1.country, INSTR(t1.country, ' mobile') - 1),
           LEFT(t1.country, INSTR(t1.country, '-') - 1)
          )
       )
    )
ORDER BY t2.country

收益率:

代码语言:javascript
复制
country           prefix
Argentina-Mobile  549
Armenia           374
Aruba             297
Ascension Island  247
Australia         61
票数 1
EN

Stack Overflow用户

发布于 2010-06-22 06:51:16

我发布了一个实时运行示例(使用SQL Azure方言):

https://data.stackexchange.com/stackoverflow/query/4822

请注意,它使用PATINDEX (这不能移植到MySQL)来查找第一个出现的空格,或者使用'-‘来首先对国家进行分类。然后,它会在类中找到最短的一个--然后再加入进来,得到结果。

票数 0
EN

Stack Overflow用户

发布于 2010-10-13 15:42:09

我认为您可以通过将国家规范化到它自己的字段(和/或带有国家id的表)中来取得长足的进步。从长远来看,这可能会有所帮助。

然后你只需要做一个简单的

代码语言:javascript
复制
select distinct country_name, min(prefix)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3088885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档