在SELECT中将数组添加到MySQL列

时间:2009-12-01 17:45:00

标签: php mysql select

我有一个数组,其中包含一组用户及其各自的业力:

$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';

有什么想法吗?有可能吗?

3 个答案:

答案 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)

如果数组中的值必须由脚本提供(即,数据库中不存在以任何方式加入它们,这是理想的情况),那么我看到两种可能性:

  1. 为您的业力创建一个临时表,插入所有业力值,然后将您的查询与您的业力数组相结合
  2. 在查询中使用case语句。如果用户数量很大,这是一种难以维持的解决方案。
  3. 生成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;
    }