【问题标题】:Sort domains in MySQL在 MySQL 中对域进行排序
【发布时间】:2015-02-02 13:40:40
【问题描述】:

我在 MySQL DB 中有一个域和子域列表,如下所示:

abc.com
contactus.def.com 
pages.abc.com
help.about.abc.com
def.com

我希望 SELECT 查询根据域名对这些域和子域进行排序,最终输出如下:

abc.com
pages.abc.com
help.about.abc.com
def.com
contactus.def.com 

我怎样才能做到这一点?请帮帮我。

【问题讨论】:

  • 这涉及到大量的字符串操作。您是否可以选择结果然后在 c# 中对它们进行排序?那里会容易得多
  • 不,我希望它只在 mysql 中完成
  • @manu 如果您只想在 MySql 中完成,请删除 C# 标签
  • 这是一个非常难以解决的问题,因为名称中有多少构成“根域”是不同的。例如 sub.example.comexample.com vs sub.example.co.uk vs example.co.uk。所以你不能只做一些简单的事情,比如去掉最后两个点组。
  • select * from domains order by reverse(name);

标签: mysql


【解决方案1】:

您需要使用带有分隔符“.”的 substring_index 执行从“结束到开始”和从“开始到结束”的顺序。并 count 出现次数=2 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index 如下:

SELECT * FROM `table` order by  SUBSTRING_INDEX(`fieldname`, '.', -2),SUBSTRING_INDEX(`fieldname`, '.', 2);

SQL 小提琴:http://sqlfiddle.com/#!2/ac8c61/1

【讨论】:

    【解决方案2】:

    substring_index(domainname,'.',-2) 表示从末尾向前搜索,找到第二个点并在其后获取所有内容。这将返回域,即。 abc.com。

    select domainname, substring_index(domainname,'.',-2) as a, domainname like "%.%.%" as b, domainname like "%.%.%.%" as c from db.domains order by a, b, c asc, 域名 asc;

    【讨论】:

    • 查找域名,查找包含两个点,然后是三个点的域名的计数,按域名排序,然后是两个点,三个点,然后是第一个字母。我从中学到了很多。好问题。
    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2010-11-02
    相关资源
    最近更新 更多