【问题标题】:How to convert normal sql query to Zend_Db_Select?如何将普通的 sql 查询转换为 Zend_Db_Select?
【发布时间】:2012-09-14 00:41:45
【问题描述】:

您好,我想将我的普通 mysql 查询转换为 zend.db.select;

我想使用这个脚本:

$select = $db->select();

// Add a FROM clause
$select->from( ...specify table and columns... )

// Add a WHERE clause
$select->where( ...specify search criteria... )

// Add an ORDER BY clause
$select->order( ...specify sorting criteria... );

$select->limit(20, 10);

下面我的查询

SELECT 
    IF(derived_messages.toid = '$user', derived_messages.fromid, 
    derived_messages.toid) friend1,c.UserName,
    derived_messages.message, derived_messages.fromid, derived_messages.toid,
    derived_messages.is_read,derived_messages.type,derived_messages.id as mesid,                    
    derived_messages.date,
    (SELECT M.message_id FROM messagesmapped M where M.message_id= derived_messages.id AND M.user_id ='$user' AND M.important = 1) as MesMapid
    FROM 
    (               
    SELECT * 
    FROM messages
    WHERE messages.deleted_by NOT 
    IN ( $user ) 
    ORDER BY Date DESC      
    ) derived_messages
    INNER JOIN Users c ON c.MemberID = IF(derived_messages.toid = '$user', derived_messages.fromid, 
    derived_messages.toid)
    WHERE (derived_messages.id IN 
    (SELECT M.message_id FROM messagesmapped M where M.message_id= derived_messages.id AND M.user_id ='$user' AND M.important = 1)                  
    AND 
    (derived_messages.toid='$user' OR derived_messages.fromid='$user'))

    GROUP BY friend1 ASC 
    ORDER BY derived_messages.date DESC, derived_messages.id DESC LIMIT $limit $offset

我希望有人可以帮助我。

谢谢。

【问题讨论】:

    标签: php mysql zend-framework zend-db-select


    【解决方案1】:

    可能但不太可能有人会为您编写查询。

    我对处理此类查询的建议是将每个单独的子查询编写为其自己的 Zend_Db_Select 对象,然后使用您已有对象的子查询构建最终查询。

    Zend_Db_Select 不直接支持IF 函数,因此您需要使用Zend_Db_Expr 将该语句添加到您的选择中。


    这是我所说的一个基本示例。让我们构建以下查询:

    SELECT IF(msg.toId = 'drew010', msg.fromId, msg.toId), id, name, age, history.ip
    FROM users
    JOIN history ON users.id = history.userId
    WHERE users.id = (
        SELECT id FROM users WHERE loginCount > 1000
    )
    GROUP BY id,
    ORDER BY age DESC
    

    首先构建选择loginCount > 1000 的用户的子选择。

    $subquery1 = $db->select()
                    ->from('users', array('id'))
                    ->where('loginCount > ?', 1000);
    

    接下来,使用 IF 函数构建外部查询:

    $cols  = array(
        new Zend_Db_Expr('IF(' . $db->quoteInto('msg.toId = ?', 'drew010') . '), msg.fromId, msg.toId'),
        'id', 'name', 'age'
    );
    
    $query = $db->select()
                ->from('users', $cols)
                ->join('history', 'users.id = history.userId', array('ip'))
                ->where('id = ?', $subquery1)
                ->group('id')
                ->order('age DESC');
    
    echo $query;
    

    输出:

    SELECT
      IF(msg.toId = 'drew010', msg.fromId, msg.toId),
      `users`.`id`,
      `users`.`name`,
      `users`.`age`,
      `history`.`ip`
    FROM `users`
    INNER JOIN `history`
      ON users.id = history.userId
    WHERE id = (
        (SELECT `users`.`id`
        FROM `users`
        WHERE (loginCount > 1000))
    )
    GROUP BY `id`
    ORDER BY `age` DESC
    

    所以要走的路是先把整个查询分解成单独的查询,然后再构造外部查询。只要有耐心,慢慢来。并阅读 Zend_Db_Select 文档以全面了解您可以使用的内容。

    【讨论】:

      猜你喜欢
      • 2020-01-18
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      相关资源
      最近更新 更多