2012-12-21 83 views
2

我與文本值混合英語MySQL數據庫表有一個文本字段&非英語條目(因爲字符串開頭字母被處理英文)。的MySQL和PHP:按字母順序排序文本英語和字符串長度的非英語

我想值進行排序,並用它在一個HTML下拉框。數據例如:

Banana 
Apple 
Juice 
西瓜 
水蜜桃 
ピタヤピタヤ 
ピーチ 

我想將它作爲排序:按字母升序排列第一

Apple 
Banana 
Juice 
西瓜 
ピーチ 
大水蜜桃 
ピタヤピタヤ 

英文條目;然後按字符串長度跟隨非英語條目。我想我必須在PHP中解決它,對吧?

PHP代碼僞

$result_set = (get result set from database with MySQL query) 
// perform array sort (after identifying English & non-English 
echo '<select>'; 
foreach($row in $result_set) { 
    echo '<option value="{ some values here }">{ row text }</option>'; 
} 
echo '</select>'; 

2個問題在這裏:

  1. 如何識別(在PHP/MySQL的)英語&非英語參賽作品?
  2. 是否有可能只在MySQL去解決它?
+1

您可能需要相當謹慎決定什麼是英語的,哪些不是。在英文文本中出現的具有重音的單詞數量驚人。更不用說包含引用外語字符串的英文文本(例如,這個問題)。 – Spudley

+0

我認爲,就我而言,我可以檢查字符串的第一個字母,看它是否是非英文字符。 (因爲我將英文字符作爲英文字符串開頭的字符串) – Raptor

回答

1

下面的ORDER BY子句中應該這樣做:

ORDER BY IF(is_english(text), text, "zzzzzzzzz"), CHAR_LENGTH(text) 

你需要弄清楚如何實現is_english()。一個簡單的方法是將一列添加到數據庫中。或者使用正則表達式來查找任何非英文字母。

0

使用此查詢,您必須使用COLLATE utf8_bin,它將進行排序。

SELECT * 
FROM Table1 
ORDER BY text COLLATE utf8_bin 

工作示例http://sqlfiddle.com/#!2/46ba8/1

+0

不按字符串的長度進行排序。 –

+0

@Jack如果按照字母順序對它進行排序,它會自動按照長度排序。 –

+0

'zz'會在'abcdefg'之前排序? – Barmar

0

我認爲MySQL的應該是能夠做到這一點,但我不能在MySQL中經歷過,所以我只能在這裏給出一個完整的PHP解決方案:

(追隨你「因爲字符串字母開頭被視爲英語」):

$result_set=array(array("val"=>1,"text"=>"Banana"),array("val"=>2,"text"=>"Apple"),array("val"=>3,"text"=>"Juice"),array("val"=>4,"text"=>"西瓜"),array("val"=>5,"text"=>"大水蜜桃"),array("val"=>6,"text"=>"ピタヤピタヤ"),array("val"=>7,"text"=>"ピーチ")); 

function isEng($str) 
{ 
    $s=strtoupper(iconv_substr($str,0,1,"UTF-8")); 
    if($s>="A" && $s<="Z") return true; 
    else return false; 
} 
usort($result_set,function($a,$b){ 
    if(isEng($a["text"])) 
    { 
     if(isEng($b["text"])) 
      return $a["text"]<$b["text"]?-1:($a["text"]>$b["text"]?1:0); 
     else 
      return -1; 
    } 
    else 
    { 
     if(isEng($b["text"])) 
      return 1; 
     else 
      return iconv_strlen($a["text"],"UTF-8")-iconv_strlen($b["text"],"UTF-8"); 
    } 
}); 

print_r($result_set); 

輸出:

Array 
(
    [0] => Array 
     (
      [val] => 2 
      [text] => Apple 
     ) 

    [1] => Array 
     (
      [val] => 1 
      [text] => Banana 
     ) 

    [2] => Array 
     (
      [val] => 3 
      [text] => Juice 
     ) 

    [3] => Array 
     (
      [val] => 4 
      [text] => 西瓜 
     ) 

    [4] => Array 
     (
      [val] => 7 
      [text] => ピーチ 
     ) 

    [5] => Array 
     (
      [val] => 5 
      [text] => 大水蜜桃 
     ) 

    [6] => Array 
     (
      [val] => 6 
      [text] => ピタヤピタヤ 
     ) 

) 
相關問題