2012-09-14 24 views
4

嗨我想將我的普通mysql查詢轉換爲zend.db.select;如何將普通的sql查詢轉換爲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 

我希望有人能幫助M於這個。

謝謝。

回答

5

這是可能的,但不太可能有人會爲你寫查詢。

我對解決這樣一個查詢的建議是將每個子查詢寫爲它自己的Zend_Db_Select對象,然後使用您已有對象的子查詢來構建最終查詢。

Zend_Db_Select不直接支持IF函數,因此您需要使用Zend_Db_Expr將該語句添加到您的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 

所以要走的路是首先將整個查詢分解爲單個查詢,然後構造外部查詢。只要有耐心,慢慢來。並閱讀Zend_Db_Select文檔以全面瞭解您可以獲得的內容。