gpt4 book ai didi

php - 如何将普通的 sql 查询转换为 Zend_Db_Select?

转载 作者:可可西里 更新时间:2023-11-01 07:31:05 26 4
gpt4 key购买 nike

您好,我想将我的普通 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_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文档以全面了解您可以使用的内容。

关于php - 如何将普通的 sql 查询转换为 Zend_Db_Select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12416719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com