2

selectステートメントがあります:

$search = "SELECT Scene, Divinite, Attestation
    FROM SceneDivList
    WHERE BINARY Divinite = '$target'
    ORDER BY FIELD( Scene);
$result = mysql_query($search, $con);

この場合、結果はフィールド「シーン」に基づくアルファベット順になります。

結果をアルファベット順ではなく、次の「アルファベット」に基づいて並べることは可能ですか?

$alphabet = array( 1 => '-' , 2 => ',' , 3 => '.' , 4 => "A",
                   5 => "j", 6 => "a", 7 => "w", 8 => "b", 
                   9 => "p", 10 => "f", 11 => "m", 12 => "n", 
                   13 => "r", 14 => "h", 15 => "H", 16 => "x", 
                   17 => "X", 18 => "s", 19 => "S", 20 => "q", 
                   21 => "k", 22 => "g", 23 => "t", 24 => "T", 
                   25 => "d", 26 => "D");

結果は次のようになります。

SCENE            ATTESTATION
jnD-Hr-m-nms,t  DI.80,11
jrp             DI.26,12
jrT,t           DI.116,17
aAb,t           DI.138,8
anx             DI.12,5
antjw           DI.148,10
wADw-msdm,t     DI.144,11
bHsw            DI.115,9
pr-n-nb=f           DI.17,7
4

5 に答える 5

2

最もクリーンな解決策は、独自のカスタム照合を定義し、Scene列がそれを使用するように指定することです。これを行うと、クエリは単純に読み取らORDER BY Sceneれ、それだけです(ちなみに、ORDER BY FIELD(Scene)意味がありません-何をチェックしましたかFIELD?)。

それ以外は、逆のことをする代わりに、データSTR_REPLACEを照合に適合させることに基づいて悪夢を一緒にハックすることができますが、私はそこに行きません。

もちろん、これらすべてを回避して、PHPで並べ替えを行うこともできますが、このアプローチは、自分で並べ替える必要のあるサブクエリに参加するクエリでは機能しません。

于 2012-04-12T11:36:00.660 に答える
1

ジョンの答えは最良の解決策です。しかし、ここにあなたのための残忍なphpソリューションがあります

$alphabet = array( 1 => '-' , 2 => ',' , 3 => '.' , 4 => "A",
               5 => "j", 6 => "a", 7 => "w", 8 => "b", 
               9 => "p", 10 => "f", 11 => "m", 12 => "n", 
               13 => "r", 14 => "h", 15 => "H", 16 => "x", 
               17 => "X", 18 => "s", 19 => "S", 20 => "q", 
               21 => "k", 22 => "g", 23 => "t", 24 => "T", 
               25 => "d", 26 => "D");

$replace_engine = 'Scene';                   
foreach($alphabet as $k=>$char) {
    $charint = sprintf("%03s",   $k);
    $replace_engine = "REPLACE(".$replace_engine.",'$char','$charint')";
}


$query = "SELECT $replace_engine as myalphabet, Scene FROM SceneDivList ORDER BY myalphabet"; 
于 2012-04-12T12:06:07.990 に答える
0

2つの解決策があります:1)コードで直接クエリの後に注文します。欠点は、パフォーマンスの問題が発生する可能性があるため、常にすべての結果を収集する必要があることです。2)配列のインデックスに基づいた順序値でテーブルに列を追加します。

多分あなたは注文するmysql関数を作成することができます...しかし私はカスタムmysql関数を十分に知りません

...そしてJonによる解決策は私の2分前に提案しました:D

于 2012-04-12T11:38:06.440 に答える
0

Jonの答えは正しいアプローチですが、IDが(自動インクリメント)整数でCがVARCHAR(1)であるテーブル(ID、C)を設定することにより、簡単で汚いバージョンを試してみることをお勧めします。

結合を使用すると、必要なレベルまで順序付けを行うことができます。

$search = "SELECT s.Scene, s.Divinite, s.Attestation
FROM SceneDivList s
INNER JOIN CustomOrder o1 ON o1.C = SUBSTRING(s.Scene,0,1)
INNER JOIN CustomOrder o2 ON o2.C = SUBSTRING(s.Scene,1,1)
INNER JOIN CustomOrder o3 ON o3.C = SUBSTRING(s.Scene,2,1)
WHERE BINARY s.Divinite = '$target'
ORDER BY o1.ID, o2.ID, o3.ID, SUBSTRING(s.Scene,4);
$result = mysql_query($search, $con);

注: これは簡単に行うことができますが、クエリ自体は以前よりも遅くなります。

于 2012-04-12T11:44:19.203 に答える
0

フィールドを総当たり文字列で置き換えて並べ替えたい場合は、PHP で文字列を生成する再帰関数が必要です。

function replace( $fields ) {
    if( empty( $fields ) ) return( "`Scene`" );

    $t = each( $fields );
    $pop = array_shift( $fields );

    return( sprintf(
        "replace(%s, '%s', '%s')",
        replace($fields),
        $t['key'],
        str_pad($t['value'], 3, '0', STR_PAD_LEFT )
    ));
}

$alphabet  = array( 1 => '-' , 2 => ',' , 3 => '.' , 4 => "A",
                   5 => "j", 6 => "a", 7 => "w", 8 => "b", 
                   9 => "p", 10 => "f", 11 => "m", 12 => "n", 
                   13 => "r", 14 => "h", 15 => "H", 16 => "x", 
                   17 => "X", 18 => "s", 19 => "S", 20 => "q", 
                   21 => "k", 22 => "g", 23 => "t", 24 => "T", 
                   25 => "d", 26 => "D");



$sql = sprintf(
"SELECT Scene, Divinite, Attestation, %s as `neworder`
FROM SceneDivList
WHERE BINARY Divinite = '%s'
ORDER BY `neworder`", 
    replace(array_flip( $alphabet  )),
    "target <- whatever that is"
);

echo $sql;

この時点で、$sql には次のクエリが含まれます。

SELECT Scene, Divinite, Attestation, 
replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(
`Scene`, 'D', '026'), 'd', '025'), 'T', '024'
), 't', '023'), 'g', '022'), 'k', '021'), 'q', '020'
), 'S', '019'), 's', '018'), 'X', '017'), 'x', '016'
), 'H', '015'), 'h', '014'), 'r', '013'), 'n', '012'
), 'm', '011'), 'f', '010'), 'p', '009'), 'b', '008'
), 'w', '007'), 'a', '006'), 'j', '005'), 'A', '004'
), '.', '003'), ',', '002'), '-', '001'
) as `neworder`
FROM SceneDivList
WHERE BINARY Divinite = 'target <- whatever that is'
ORDER BY `neworder`
于 2012-04-12T12:20:35.760 に答える