[英]Natural Sorting query is not working in mysql
對不起我的英語不好。 我想以自然排序方式對我的記錄進行排序。 這是一些:
MBT44-2N-1
MBT44-4N-3
MBT44-8N-1
MBT44-6N-3
MBT66-6N-1
MBT86-8N-3
MBT88-12N-1
MBT88-12N-3
MBT88-4N-1
MBT88-4N-3
MBT88-6N-1
MBT88-6N-3
MBT88-8N-1
MBT88-8N-3
MBT1212-12N-1
MBT1212-12N-3
MBT1212-4N-1
MBT1212-4N-3
MBT1212-8N-1
MBT1212-8N-3
MBT1616-6N-1
MBT1616-8N-3
MBT2020-8N-1
我已經有了使用長度和列名順序的順序,如下所示:
LENGTH({$wpdb->posts}.post_title) ASC, {$wpdb->posts}.post_title ASC
但結果並沒有達到我們想要的效果。 這是一個簡短的查詢結果:
MBT1212-8N-1
MBT1212-8N-3
MBT1616-4N-1
MBT1616-8N-1
MBT1616-8N-3
MBT2020-8N-1
*MBT1212-12N-1*
*MBT1212-12N-3*
請注意結果底部的“MBT1212-12N-1”和“MBT1212-12N-3”。 它們應該是下一個 MBT1212-8N-3 產品。
這是我的查詢的一部分,但它按部分工作:
SELECT post_title FROM `wp_posts`
WHERE post_type = 'product' AND post_title LIKE 'MBT%'
order BY length(SUBSTRING_INDEX(`post_title`,'-',1)) ASC,
post_title ASC,
length(post_title) asc,
post_title asc;
這是另一種方法:
SELECT post_title FROM `wp_posts`
WHERE post_type = 'product' AND post_title LIKE 'MBT%'
order BY length(SUBSTRING_INDEX(`post_title`,'-',1)) ASC,
CAST(SUBSTRING_INDEX(`post_title`,'-',1) as UNSIGNED) ASC,
post_title ASC,
length(post_title) asc,
post_title asc;
我嘗試用“連字符”分割記錄並按每個部分排序,但它有點奇怪。
我感謝您的所有幫助。 提前致謝。
也許是一種笨拙的方式,但對我來說效果很好。 嘗試這個:
SELECT post_title,
RPAD(
CONCAT(
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(post_title, "-", 1), "-", -1),12," "),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(post_title, "-", 2), "-", -1),12," "),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(post_title, "-", 3), "-", -1),12," "),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(post_title, "-", 4), "-", -1),12," ")
),48,"0"
) AS C
FROM mytable
ORDER BY C ASC
基本思想是將字符串中用分隔符分隔的每個部分(在您的情況下為“-”)轉換為用空格填充的等長子字符串。
在您的示例中,帖子將轉換為 48 個字符、4 個級別乘以 12 個字符的字符串,如下所示:
"MBT44-2N-1" --> "MBT44 2N 1 1 "
"MBT44-4N-3" --> "MBT44 4N 3 3 "
"MBT44-8N-1" --> "MBT44 8N 1 1 "
"MBT44-6N-3" --> "MBT44 6N 3 3 "
然后使用此字符串對結果進行排序。 如果您有更多級別,您只需添加更多如上所述的 LPAD 行並增加排序字符串總長度的值。
這假定您知道子字符串的最大長度以及字符串中除以“-”的最大級別數。 但這可以通過您在檢查字符串后設置的變量來處理。
您還可以為不同級別使用不同的分隔符,但前提是它們位於同一位置以對所有值進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.