我有一个数组,其中包含一组用户及其各自的业力:
$some_array = Array
(
[user_id] => Array
(
[0] => 4
[1] => 3
[2] => 5
[3] => 1
)
[karma] => Array
(
[0] => 129
[1] => 87
[2] => 13
[3] => 20
)
)
我想知道,当你从MySQL表中检索用户数据时,你可以添加一个带有karma数组的额外列,并按extra_column排序:
$query = 'SELECT user.*, {{$some_array['karma'] as extra_column}} WHERE
user.id IN '.(implode(',',$some_array['user_id'])).' ORDER BY extra_column';
有什么想法吗?有可能吗?
答案 0 :(得分:2)
SELECT id, ELT(FIELD(id, 4, 3, 5, 1), 129, 87, 13, 20) AS karma
FROM (
SELECT 4 AS id
UNION ALL
SELECT 3 AS id
UNION ALL
SELECT 5 AS id
UNION ALL
SELECT 1 AS id
) q
WHERE id IN (4, 3, 5, 1)
ORDER BY
karma
答案 1 :(得分:1)
不是真的(至少没有经过一些非常讨厌的动态sql生成)。
您必须在用户表(或您可以加入用户表的其他表)的列中拥有业力。似乎应该存储在数据库中,不管怎么说呢?
答案 2 :(得分:0)
如果数组中的值必须由脚本提供(即,数据库中不存在以任何方式加入它们,这是理想的情况),那么我看到两种可能性:
生成case语句的代码可能如下所示:
$query = 'SELECT *, ' . GenerateCaseStatement($some_array) . ' AS extra_column FROM user WHERE user.id in (' . implode(',', $some_array['user_id']) . ' ORDER BY extra_column';
function GenerateCaseStatement($some_array)
{
$str = 'CASE id ';
for (i=0; i<array_len($some_array['user_id']); ++i)
{
$str .= ' WHEN ' . (int)($some_array['user_id'][i]) . ' THEN ' . (int)($some_array['karma'][i]);
}
$str .= ' ELSE NULL END';
return $str;
}