假设有以下数组:
$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代码?
答案 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 ...
如果数组中有很多值,那将会有点麻烦。
答案 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作为这个新数组的索引。这需要对上述内容进行适度的重写。