长期读者,第一次提问......呃。
我现在正在重构和升级一些令人难以置信的旧PHP和MySQL查询(通过PDO),并且遇到了一个非常复杂的订购要求,我无法做对。
我有一个列出标题的表格。让他们说他们是书。我需要获取所有这些标题的列表,以便根据他们的第一个字母在不同的标签下列出它们。订购要求如下:
E.g。
这三个都很容易。 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
title
值中,任何人都可以提出一个很好的方法,然后在PHP中迭代它们时分割记录,以便填充27个AZ和#tabs?可能是列出SQL 排序的第一个字符的虚拟列? (代码I' m重构通过运行27个查询(!)实现了这一点,对于依次以每个字母开头的标题 - 如果我可以避免它,我不想做的事情!) 任何有关解决此问题的想法,帮助或建议都将受到高度赞赏和感激!当然,很高兴尝试以不同的方式解决这个问题。
答案 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