2

我在 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>';

这里有2个问题:

  1. 如何识别英文和非英文条目(在 PHP / MySQL 中)?
  2. 是否可以仅在 MySQL 中解决?
4

3 回答 3

1

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

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

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

于 2012-12-21T07:43:06.457 回答
0

使用这个查询,你只需要使用COLLATE utf8_bin它就会排序。

SELECT *
FROM Table1 
ORDER BY text COLLATE utf8_bin

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

于 2012-12-21T07:27:57.863 回答
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] => ピタヤピタヤ
        )

)
于 2012-12-21T08:05:54.160 回答