MySQL& PHP:按英文字母顺序排序文本&字符串长度为非英语

时间:2012-12-21 07:19:24

标签: php mysql

我在MySQL数据库表中有一个文本字段,其中文本值混合了英语和非英语条目(假设字符串以字母开头,则视为英语)。

我想对值进行排序并在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>';

这里有两个问题:

  1. 如何识别英语&amp;非英语条目(在PHP / MySQL中)?
  2. 是否可以仅在MySQL中使用它?

3 个答案:

答案 0 :(得分:1)

以下ORDER BY子句应该这样做:

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

您需要弄清楚如何实施is_english()。一种简单的方法是向数据库添加一列。或者使用正则表达式查找任何非英文字母。

答案 1 :(得分:0)

使用此查询,您只需使用COLLATE utf8_bin即可进行排序。

SELECT *
FROM Table1 
ORDER BY text COLLATE utf8_bin

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

答案 2 :(得分: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] => ピタヤピタヤ
        )

)