我在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>';
这里有两个问题:
答案 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
答案 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] => ピタヤピタヤ
)
)