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 中完成吗?


注意:我没有对要从中提取此数据的数据库的写访问权限,也没有创建架构,因此我无法向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

fake结构可以通过 phpforeach循环创建。

$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

你可以试试 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 回答
0

您不能仅使用 SQL 来执行此操作,因为 id 未在表中定义(无法承受 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
...

根据您的界面,您可能能够准备和执行,但您没有提供足够的细节来生成特定的代码。

您必须多次运行查询,但您可以 push 或 array_merge。虽然,我个人认为你应该使用 user_ids 作为这个新数组的索引。这将需要对上述内容进行适度的重写。

于 2012-12-08T02:33:49.297 回答