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

次のORDERBY句で実行できます。

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

を実装する方法を理解する必要がありますis_english()。簡単な方法は、データベースに列を追加することです。または、正規表現を使用して英語以外の文字を探します。

于 2012-12-21T07:43:06.457 に答える
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 に答える
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 に答える