复杂的MySQL ORDERing:''和标点符号被忽略,加上数字上次

时间:2016-05-05 20:34:29

标签: php mysql sql-order-by

长期读者,第一次提问......呃。

我现在正在重构和升级一些令人难以置信的旧PHP和MySQL查询(通过PDO),并且遇到了一个非常复杂的订购要求,我无法做对。

我有一个列出标题的表格。让他们说他们是书。我需要获取所有这些标题的列表,以便根据他们的第一个字母在不同的标签下列出它们。订购要求如下:

  1. 忽略领先'' (对于' a'或'')
  2. 不是必需的
  3. 忽略领先标点符号
  4. 最后放置号码
  5. E.g。

    • 双城记
    • 汤姆索亚历险记
    • 查理和巧克力工厂
    • @ hotmail.com:2002年的恐怖故事
    • '否' - 站在你的立场
    • Dorian Gray的照片
    • 战争与和平
    • 第八个矮人
    • 1000年的法国人讨厌

    这三个都很容易。 1& 2我可以毫无困难地一起做 - 虽然有一个特定的标点符号列表,而不是一个全能的(正则表达式可能?)。 3由于上一个问题,我可以独自完成' ORDER BY alphabet first then follow by number&#39 ;;但我无法让所有三个人同时工作。

    实现要求1和2,现有的查询如下:

    SELECT title FROM books WHERE discontinued=0 ORDER BY TRIM(LEADING " " FROM TRIM(LEADING "!" FROM TRIM(LEADING "@" FROM TRIM(LEADING "'" FROM TRIM(LEADING "(" FROM TRIM(LEADING "..." FROM TRIM(LEADING "%" FROM TRIM(LEADING "The " FROM title)))))))) ASC, year_of_publication ASC
    
    • 首先,主要是,任何人都可以帮助我同时完成所有3个工作吗?
    • 其次,请记住''并且所有标点符号都保留在返回给我的PHP的title值中,任何人都可以提出一个很好的方法,然后在PHP中迭代它们时分割记录,以便填充27个AZ和#tabs?可能是列出SQL 排序的第一个字符的虚拟列? (代码I' m重构通过运行27个查询(!)实现了这一点,对于依次以每个字母开头的标题 - 如果我可以避免它,我不想做的事情!)
    • 第三,是否有一种更简洁的方法可以从标题中删除标点符号,而不是单独列出标点符号? (不是那么重要,但如果它能使代码更好/更有效......)
    • 第四个也是最后一个,如果有人可以通过某种方式来订购这些数字1,2,3 ......而不是1,10,2,3,那也是值得赞赏的。 (同样,我已经看到了这种'自然排序'在更简单的查询中实现,但不是用这样的东西。它并不重要,但如果它是好的,那就太好了可能与我的所有其他要求一起使用!)

    任何有关解决此问题的想法,帮助或建议都将受到高度赞赏和感激!当然,很高兴尝试以不同的方式解决这个问题。

1 个答案:

答案 0 :(得分:0)

只要你order by一个函数而不是一个字段,所有使用索引的机会都会从窗口中消失。
我建议你不要遵循这条路线。而是在表格中添加一个额外的字段,用于修剪您不想订购/过滤的部分并将其用于select

SELECT title FROM books WHERE discontinued=0   
ORDER BY trimmed_title ASC, year_of_publication ASC  

在表格中插入数据时,您可add a trigger到为您剪裁的表格

delimiter ||

CREATE TRIGGER bi_books BEFORE INSERT ON books
  FOR EACH ROW
  BEGIN
    #include whatever trimming you want here.
    set NEW.trimmed_title = TRIM(LEADING "The " FROM NEW.title);
  END;
||

delimiter ;

有关数字的自然排序信息,请参阅此处:Natural Sort in MySQL