【问题标题】:MySQL: How to order by (-) dashMySQL:如何按 (-) 破折号排序
【发布时间】:2012-05-11 03:52:45
【问题描述】:

我怎样才能order by破折号?

比如我下面有这些数据,

page_id   url
1         - a
2         - b
3         --- c
4         --- d
5         - e
6         - f
7         -- g
8         -- h

我追求的结果,

page_id   url
1         - a
2         - b
5         - e
6         - f
7         -- g
8         -- h
3         --- c
4         --- d

如果我这样做,

ORDER by x.url ASC

我还是明白了,

page_id   url
1         - a
2         - b
3         --- c
4         --- d
5         - e
6         - f
7         -- g
8         -- h

有什么想法吗?

编辑:

我的实际 SQL,

SELECT 
    *,
    IF(grandparentURL REGEXP '^[a-z0-9\-]+$', CONCAT('--- ', url), IF(parentURL REGEXP '^[a-z0-9\-]+$', CONCAT('-- ', url), CONCAT('- ', url))) AS url
FROM
(
    SELECT 
        p.page_id,
        p.url,
        p2.url AS parentURL,
        p3.url AS grandparentURL

    FROM page AS p

    LEFT JOIN page AS p2 
    ON p.parent_id = p2.page_id AND p.page_id != p2.page_id

    LEFT JOIN page AS p3 
    ON p2.parent_id = p3.page_id AND p2.page_id != p3.page_id

    WHERE IF('5' REGEXP '^[0-9]+$', p.page_id != '5', p.page_id IS NOT NULL)
    AND p.url != 'cms' 
) x

ORDER by x.url ASC

【问题讨论】:

  • 你是如何定义你的列的?我根本没有得到这个结果。我得到你想要的。见这里:sqlfiddle.com/#!2/51638/1
  • @MikeRyan - 我不知道,请查看我的编辑以了解我的实际查询。谢谢。
  • @pst - 我在 MyISAMutf8_general_ci
  • 再次,使用您的查询并使用utf8-general-c1 排序规则定义您的列,我得到了您想要的:sqlfiddle.com/#!2/79873/1 版本是什么?我不明白为什么会出错。

标签: php mysql sql sql-order-by


【解决方案1】:

MULTIPLE order by... 首先按找到空间的位置首先分组...从那个位置开始,然后按整个 URL 排序。由于常见的 -b 和 -a 将在同一组中,因此它们的空间将它们保持在组“1”中......然后,从那里,整个 URL 将强制您正确的 -a、-b、-c 等

ORDER BY INSTR('x.url', ' '), x.url

【讨论】:

    【解决方案2】:

    试试这个

    ORDER BY SUBSTRING_INDEX(url, ' '),url
    

    第一部分按字符串中第一个空格的位置排序

    【讨论】:

    • 不,不应该,这就是为什么实际的 URL 是 ORDER 子句的第二部分。您还可以使用 trim(replace(URL,'-','')) 作为 ORDER BY 子句的第二部分
    • 我收到此错误#1582 - Incorrect parameter count in the call to native function 'SUBSTRING_INDEX'
    • @lauthiamkok - 试试SUBSTRING_INDEX(url, ' ', 1)
    • @dem - 是的,它始终是一个空格,而不是控制代码字符,请参见我上面的编辑。谢谢。
    • @Dems - 是的,我尝试过SUBSTRING_INDEX(url, ' ', 1) 仍然一样...
    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 2015-03-31
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多