簡體   English   中英

自然排序查詢在 mysql 中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM