0

これに対する答えがまだないことに驚いています...それは私が根本的に間違ったことをしていることを私に示唆しています。または他のみんながそうです。

クライアント側で並べ替えられた可能性のある繰り返し値の配列がPOSTリクエストとして受信され、それらの値によってインデックス付けされ、それらの値と同じ順序で冗長性を維持するMySQLから結果セットを返すことが目標であるとします。 !!!

したがって、値が次の場合:1,2,3,2,3,4,5,5,5

望ましい結果は次のとおりです。

+----+-------+
| id | value |
+----+-------+
|  1 | one   |
|  2 | two   |
|  3 | three |
|  2 | two   |
|  3 | three |
|  4 | four  |
|  5 | five  |
|  5 | five  |
|  5 | five  |
+----+-------+

以下のコードは機能しているようですが、キリスト、真剣に?array_intersect()単純な結果セットを入力配列と同じパターンで順序付けて繰り返すために、悪用して2つの異なるループを作成する必要があります。そのうちの1つはネストされていますか?これは、それが実際に行われることになっている方法ではありえません。

function repQuery($inids,$incol,$querystring,$emptyval = "NULL"){
    # incol is the name of a column in the query
    # inids is an array within which the value of incol must be found
    # querystring is a query of the form...
    # "select FOO from BAR where %s in (%s) BLAH BLAH BLAH"
    # The first %s will be replaced by $incol and the second by $inids
    $qq = mysql_query(sprintf($querystring,$incol,implode(",",$inids))) or die(mysql_error());
    $nf = mysql_num_fields($qq); $dummyrow = array();
    for($ii = 0; $ii < $nf; $ii+= 1){
        $dummyrow[mysql_field_name($qq,$ii)] = $emptyval;
    };
    $out = array_fill(0,count($inids),$dummyrow);
    while($rr = mysql_fetch_assoc($qq)){
        foreach(array_keys(array_intersect($inids,array($rr[$incol]))) as $ii) {
            $out[(int)$ii] = $rr;
        }
    }
    return $out;
}

私の質問は次のとおりです。受け入れられているパターンやPHP配列コマンド、または私が見落としている他の何かがありますか?上記ではRワンライナーになります。

4

2 に答える 2

1

MySQLの機能であれば素晴らしいと思いますがORDER BY、繰り返しパターンで使用する方法はないと思います(を介して「カスタムパターン」を取得できますが、ORDER BY FIELD()完全にはありません)。

これだけのためのPHPの特別なメソッドについてはよくわかりませんが、一時配列を使用すると、頭痛の種を減らすことができるかもしれません。

function repQuery($inids,$incol,$querystring,$emptyval = "NULL"){
    $qq = mysql_query(sprintf($querystring,$incol,implode(",",$inids))) or die(mysql_error());

    // build a temporary array of all of the results - the row's "ID" is the array index
    $tmpResults = array();
    while ($row = mysql_fetch_assoc($qq)) {
        $tmpResults[$row['id']] = $row;
    }

    // iterate through the order/list of IDs and insert each result one after the other
    $out = array();
    foreach ($inids as $id) {
        $out[] = $tmpResults[$id];
    }
    return $out;
}

$tmpResultsこれにより、行のIDを配列のインデックスとして使用して、すべてのSQL結果(IDごとに1つ)が配列に配置されます。次のステップは、複製するパターンを含むリストを反復処理し、対応するレコード結果を配列$inidsに挿入することです。$out

于 2012-08-17T22:35:35.177 に答える
0

私はPDOを使用しており、DBからのデータの取得は以下のPDOを使用して行われます。したがって、何らかの理由でPDOを介してデータを取得することに興味がない場合は、わざわざ読んではいけません。(私はPDOを使用しているため、mysql_ *コマンドに精通していません。)

私の場合は、MySQLに渡す前に$ inidsを一意(array_unique)にし、SQLステートメントを変更してSELECTステートメントにIDを含めます。何かのようなもの:

select %s, FOO from BAR where %s in (%s)

次に、sprintfは次のようになります

$tempIds = array_unique($inids);
sprintf($querystring,$incol,$incol,implode(",",array_unique($tempIds)))

PDOは次のようになります

$db->prepare(sprintf($querystring,$incol,$incol,implode(",",$tempIds)));
$db->execute(array());
$results = $db->fetchAll();

したがって、組織構造には次のようなものを使用します。

$ids = array();
$srch = array();
foreach ($results AS $key=>$dbData) {
  $ids[] = $dbData['ID'] . ":" . $dbData['FOO'];
  $srch[] = (string) $dbData['ID'];
} 

$out = str_replace($srch, $ids, $inids);

これを行うにはもっと良い方法があると思いますが、まだ思いつきません。これは、$inidsが次のような配列であると想定して機能するはずです。

$inids = array('1', '2', ...);

値が文字列でない場合は、str_replaceに渡す前に文字列に変換する必要があります。次に、それらをページまたはどこかに出力したい場合は、次のようにします。

foreach ($out AS $key=>$str) {
$data = explode(':', $str);
  echo '<br>' . $data[0] . \t . '|' . \t . $data[1];
}

好きなようにechoステートメントを台無しにします。

于 2012-08-17T23:44:24.017 に答える