【问题标题】:Retrieve mysql data without any order applied在没有应用任何顺序的情况下检索 mysql 数据
【发布时间】:2015-01-25 14:37:01
【问题描述】:

我有一个名为actions 的表,主键为action_id,我正在从该表中检索数据,例如传递我自己订购的action_ids

$actionIds = array(5,9,10,21,3,18,4);
$actionsTb = Engine_Api::_()->getDbtable('actions','activity');

$postSelect = $actionsTb->select()
              ->where('action_id IN(?)', $actionIds)
              ->where('type = ?', 'status')
             ;

现在的问题是,当我按升序返回结果时,例如 (3,4,5,9,10,18,21),但是当我传递操作 ID 时,我想要结果的顺序意味着不要'不想对结果应用任何顺序。 请帮我。你也可以用简单的查询来回复。

【问题讨论】:

    标签: mysql zend-framework socialengine


    【解决方案1】:

    既然你用php,为什么不用循环来动态创建where子句,这里是代码

    $where = "action_id IN(";
    
    for($x=0; $x<count($actionIds); $x++)
    {
    
        // code for adding comma in every end of id 
        if($x==count($actionIds)-1)
        {
           // found the last data in array add closing parenthesis in IN funtion
           $where.=$actionIds[$x].")";
    
        }
        else
        {
           $where.=$actionIds[$x].",";
        }
    }
    

    首先测试输出回显

    echo $where; //so i think the result is "action_id IN(5,9,10,21,3,18,4)"
    

    这是完整的代码

    $actionIds = array(5,9,10,21,3,18,4);
    $where = "action_id IN(";
    
    for($x=0; $x<count($actionIds); $x++)
    {
    
        // code for adding comma in every end of id 
        if($x==count($actionIds)-1)
        {
           $where.=$actionIds[$x].",";
        }
        else
        {
          // add closing parenthesis in IN funtion
           $where.=$actionIds[$x].")";
        }
    }
    
    $actionsTb = Engine_Api::_()->getDbtable('actions','activity');
    
    $postSelect = $actionsTb->select()
              ->where($where)
              ->where('type = ?', 'status')
             ;
    

    【讨论】:

    • 感谢 CodeSlayer,我有订单或操作 ID,但我想要的是,当我通过这些 ID 进行查询时,如果我不通过任何订单,它会按 ASC 顺序返回数据,比如我像你说的那样有id的顺序 echo $where; //所以我认为结果是“action_id IN(5,9,10,21,3,18,4)”我想要结果返回顺序,因为这些 id 是......但它会返回顺序 ASC,如(3, 4,5,10..)
    • 为什么不在查询中添加order by action_id
    • 默认情况下它返回 ASC 顺序,但我想要顺序,因为我在我的 Ids 数组中传递了 id。在 mysql 中,如果你不传递任何命令,它会自动给你 ASC 命令。我不想应用任何订单,我只希望结果排序,因为我已将 Ids 数组传递给它。
    • 我认为在 mysql 中不可能
    • 一种可能的解决方案是,我对要传递的 id 运行一个循环并一个一个地获取结果,并将这些结果一个一个地附加到一个数组中,但它会处理大量对服务器的请求. :(
    【解决方案2】:

    我不知道zend 编码,但以下方法可能会对您有所帮助。

    ->where( 'FIND_IN_SET( action_id, ? )', $actionIds )
    

    我不确定zend 的where 是否将数组 $actionIds 转换为线性项目值,即'5,9,10,21,3,18,4'。如果转换,部分结果查询将如下所示:

    where find_in_set( action_id, '5,9,10,21,3,18,4' )
    

    示例

    mysql> select find_in_set( 18, '5,9,10,21,3,18,4' );
    +---------------------------------------+
    | find_in_set( 18, '5,9,10,21,3,18,4' ) |
    +---------------------------------------+
    |                                     6 |
    +---------------------------------------+
    1 row in set (0.00 sec)
    

    参考
    FIND_IN_SET 上阅读MySQL 文档

    【讨论】:

    • 我只想按我传递 id 的顺序取回数据,就像我按这个顺序( 3,6,2,8,7 )传递查询 id 一样,它会给出结果ASC 订单...我想要订单作为我数组中的那些 id...您可以在简单的查询中告诉我,我将自己构建 zend 查询。
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 2013-05-05
    • 2022-12-22
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多