Php 向SELECT中的MySQL列添加数组

Php 向SELECT中的MySQL列添加数组,php,mysql,select,Php,Mysql,Select,我有一个数组,其中包含一组用户及其各自的业力: $some_array = Array ( [user_id] => Array ( [0] => 4 [1] => 3 [2] => 5 [3] => 1 ) [karma] => Array ( [0] => 129

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

$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数组添加一个额外列,并按该额外列排序:

 $query = 'SELECT user.*, {{$some_array['karma'] as extra_column}} WHERE
 user.id IN '.(implode(',',$some_array['user_id'])).' ORDER BY extra_column';
有什么想法吗?有可能吗?

不太可能(至少在没有经过一些非常讨厌的动态sql生成的情况下)


您必须将业力放在用户表(或您可以加入到用户表的其他表)的一列中。似乎无论如何都应该存储在数据库中,对吗?

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

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
  • 为你的业力创建一个临时表,插入所有业力值,然后将你的查询与业力数组连接起来
  • 在查询中使用case语句。如果用户数量很大,这是一个站不住脚的解决方案
  • 生成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;
    }
    
    $query='SELECT*,'。GenerateCaseStatement($some_数组)。'作为user WHERE user.id所在的user的额外列('.infrade(',',$some_array['user_id'])。'ORDER BY extra_column';
    函数GenerateCaseStatement($some_数组)
    {
    $str='案例id';
    
    对于(i=0;i是否希望额外的列仅出现在SELECT的结果中?数组中的值不在数据库中?我必须同意Eric的意见。可能还有另一种解决方案,在返回sql结果后,您可以使用表存储一些数据或进行某种计算。是否尝试将数组与结果,或单个数组项到行号?实际上,只是单个数组到行号…和@True Soft,这些因果报应计算会根据查看它们的用户和他查看它们的时间而变化,这就是为什么我不明白为什么要存储它。我不知道这些函数存在。这是一个比我的解决方案更干净的解决方案案例陈述。它成功了!但不知何故,在我删除了(选择…联合所有)内容之后…在它显示用户表中的所有用户之前。哦,我想感谢大家的兴趣…这个网站真的很棒!