代码之家  ›  专栏  ›  技术社区  ›  Samin

向select中的mysql列添加数组

  •  1
  • Samin  · 技术社区  · 15 年前

    我有一组用户和他们各自的业力:

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

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   Quassnoi    15 年前
    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
    
        2
  •  1
  •   Eric Petroelje    15 年前

    不是真的(至少不经过一些非常讨厌的动态SQL生成)。

    您必须在用户表(或者您可以加入到用户表中的其他表)的列中拥有业力。看起来应该存储在数据库中,对吧?

        3
  •  0
  •   Dathan    15 年前

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

    1. 为您的业力创建一个临时表,插入所有业力值,然后将您的查询与您的业力数组连接起来。
    2. 在查询中使用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;
    }