0

次の配列を想定しています。

$users = array(
    // User ID => Username
    '72' => 'jack192',
    '23' => 'robert1984',
    '253' => 'mary111',
    '4' => 'jason92'
);

および次の表:

Table myTable:
username | colFoo | colBar

次のようなクエリを実行したいのですが、テーブルにない列 (配列からのユーザー ID) を出力に追加したいと思います。

$user_string = implode("','", array_values($users));
$query = "SELECT username, colFoo, colBar FROM myTable WHERE username IN ('$user_string')";

これは通常、次のように出力されます。

Array
(
    [0] => Array
        (
            [username] => jack192
            [colFoo] => 98
            [colBar] => 7
        )

    [1] => Array
        (
            [username] => robert1984
            [colFoo] => 
            [colBar] => 2
        )

    [2] => Array
        (
            [username] => mary111
            [colFoo] => 41
            [colBar] => 9
        )

    [3] => Array
        (
            [username] => jason92
            [colFoo] => 46
            [colBar] => 13
        )
)

user_idただし、元の配列のキーに対応する出力を次のようにしたいと思います。

Array
(
    [0] => Array
        (
            [username] => jack192
            [colFoo] => 98
            [colBar] => 7
            [user_id] => 72
        )

    [1] => Array
        (
            [username] => robert1984
            [colFoo] => 
            [colBar] => 2
            [user_id] => 23
        )

    [2] => Array
        (
            [username] => mary111
            [colFoo] => 41
            [colBar] => 9
            [user_id] => 253
        )

    [3] => Array
        (
            [username] => jason92
            [colFoo] => 46
            [colBar] => 13
            [user_id] => 4
        )
)

私は基本的に、ユーザーの ID をクエリにフィードし、MySQL がそれ以上何もしないで、出力としてそれを取得したいと考えています。PHPコードを追加せずに純粋にSQLでこれを行うことは可能ですか?


注: このデータを取得している DB への書き込みアクセス権がなく、スキーマを作成していないため、user_idフィールドなどを追加することはできません。

4

3 に答える 3

2

これは、他の2つの回答のほぼマッシュアップです。JOIN「偽の」テーブルとそれを構築できますmyTable

SELECT t.username, t.colFoo, t.colBar, s.user_id 
FROM myTable t 
LEFT JOIN
   (
    SELECT 72 as user_id, 'jack192' as username
       UNION SELECT 23 as user_id, 'robert1984' as username
       UNION SELECT 253 as user_id, 'mary111' as username
       UNION SELECT 4 as user_id, 'jason92' as username
   ) s
ON t.username = s.username;

SQLFiddle の例 - sqlfiddle.com/#!2/64650/2

テーブル構造はphpループfakeで作成できます。foreach

$select = '';
foreach ($users as $k => $v){
$select .=  "UNION SELECT $k as user_id, '$v' as username\n";
}
echo ltrim($select, "UNION ");

まだ退屈で理想的な解決策ではありませんが、別のオプションです。

于 2012-12-08T08:50:32.527 に答える
0

ID がテーブルで定義されていないため、SQL だけでこれを行うことはできません (Hulka によって提案された面倒な case ステートメントにもかかわらず)。

質問への直接的な回答は少なくなりますが、別の解決策を提供します。

ただし、php に「小さな」変更を加えると、目的の結果が得られます。

$user_string = implode("','", array_values($users));
foreach ($users as $k => $v){ 
  $query[$k] = "SELECT \"$v\"
                       ,username 
                       ,colFoo
                       ,colBar 
                FROM myTable WHERE username IN ('$user_string')";
}

クエリは基本的に「SELECT "6" as user_id, field from TABLE;」と同じです。ユーザーごとに、これが返されます

6   field
----------
6   value1
6   value2
...

インターフェイスによっては、準備して実行できる場合がありますが、特定のコードを生成するのに十分な詳細が提供されていません。

クエリを複数回実行する必要がありますが、プッシュまたは array_merge することができます。ただし、個人的には、この新しい配列のインデックスとして user_ids を使用する必要があると思います。それには、上記を適度に書き直す必要があります。

于 2012-12-08T02:33:49.297 に答える
0

あなたはCASEを試すかもしれません

SELECT username, colFoo, colBar,
CASE `username`
  WHEN 'jack192' THEN SELECT 72;
  WHEN 'robert1984' THEN SELECT 23;
  ELSE SELECT NULL;
...
END CASE userid
FROM myTable ...

配列に多くの値がある場合、少し面倒になります。

http://dev.mysql.com/doc/refman/5.0/en/case.html

于 2012-12-08T02:29:52.600 に答える