Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将普通sql查询转换为Zend_Db_Select?_Php_Mysql_Zend Framework_Zend Db Select - Fatal编程技术网

Php 如何将普通sql查询转换为Zend_Db_Select?

Php 如何将普通sql查询转换为Zend_Db_Select?,php,mysql,zend-framework,zend-db-select,Php,Mysql,Zend Framework,Zend Db Select,您好,我想将我的普通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 $s

您好,我想将我的普通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
我希望有人能在这方面帮助我


谢谢。

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

我建议处理这样一个查询,将每个单独的子查询编写为自己的
Zend\u Db\u Select
对象,然后使用已有对象的子查询构建最终查询

Zend\u Db\u Select
不直接支持
IF
函数,因此需要使用将该语句添加到Select中


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

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

因此,方法是首先将整个查询分解为单个查询,然后构造外部查询。只要有耐心,慢慢来。然后仔细阅读文档,全面了解您可以获得的信息