【问题标题】:Adding an array to a MySQL column in SELECT在 SELECT 中将数组添加到 MySQL 列
【发布时间】:2009-12-01 17:44:59
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否希望该额外列仅出现在您的 SELECT 结果中?数组中的值不在数据库中?
  • 我必须同意 Eric 的观点。也许还有另一种解决方案,您可以使用表存储一些数据或在返回 sql 结果后进行某种计算。您是想将数组与结果相关联,还是将单个数组项与行号相关联?
  • 实际上,只是行号的单个数组......和@True Soft,这些业力计算会根据正在查看它们的用户而变化,当他正在查看它们时,这就是我不这样做的原因不明白我为什么要存储它。

标签: php mysql select


【解决方案1】:
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

【讨论】:

  • 我不知道这些功能存在。这比我的案例陈述要干净得多。
  • 成功了!但不知何故,在我删除了 (SELECT... UNION ALL) 东西之后...在它显示 user_table 中的所有用户之前。
  • 哦,我要感谢大家的关注...这个网站真的很棒!
【解决方案2】:

不是真的(至少在没有经过一些非常讨厌的动态 sql 生成的情况下不会)。

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

【讨论】:

    【解决方案3】:

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

    1. 为您的 karma 创建一个临时表,插入所有 karma 值,然后将您的查询与您的 karma 数组连接
    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      相关资源
      最近更新 更多