返回MySQL中没有找到的值?

时间:2012-12-08 02:02:51

标签: php mysql

假设有以下数组:

$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不再做任何事情。这是否可以在SQL中完全没有任何额外的PHP代码?


注意:我没有对数据库的写访问权我从中提取数据,而且我没有创建模式,因此我无法添加{ {1}}字段或其他内容。

3 个答案:

答案 0 :(得分: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 ");

仍然是一个乏味且不理想的解决方案,但另一种选择。

答案 1 :(得分: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

答案 2 :(得分: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”基本相同,作为user_id,来自TABLE的字段;'对于每个用户,这将返回

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

取决于您可能准备和执行的界面,但您没有提供足够的详细信息来生成特定代码。

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