gpt4 book ai didi

php - Zend2 Db\Select 带有带 HAVING 的动态 IN 子句

转载 作者:行者123 更新时间:2023-11-30 21:54:06 26 4
gpt4 key购买 nike

SELECT 
CONCAT_WS(' ', user.firstname, user.lastname) AS name,
user.email AS email
FROM
user
WHERE
op_id IN (
SELECT
user.op_id AS op_id
FROM
user
WHERE
last_login_on IS NOT NULL
GROUP BY op_id
HAVING (SUM(IF(DATE(last_login_on) > DATE(DATE_SUB(NOW(), INTERVAL 31 DAY)), 1, 0)) = 0)
ORDER BY op_id ASC)
AND role_type = 'owner';

从上面的 SQL 中,如果所有用户在上个月内登录,则分配 1,如果超过一个月未登录,则分配 0,然后将结果集缩减为具有 0 次登录的 IN 子句,然后选择op_id 所有者详细信息。

这已在 Zend DB\Select 中复制并且所有工作都按预期进行,除了 HAVING 子句在生成的 SQL 查询中丢失,当用作新表达式时(“SUM(IF(DATE(last_login_on)> DATE(DATE_SUB (NOW(), INTERVAL 31 DAY)), 1, 0)) = 0").

这个表达式可以应用于 $select->having() 语句吗?

最佳答案

这应该是可能的,Selecthaving() 方法接受一个表达式作为参数。问题在于您使用的是哪个表达式:\Zend\Db\Sql\Expression\Zend\Db\Sql\Predicate\Expression,尽管 Predicate\Expression 继承自 Sql\Expression。老实说,我并不完全清楚其中的区别,但我能够创建您的查询而不会迷路:

$select = new Select('user');

$inSelect = new Select('user');
$inSelect->columns(array('op_id' => 'op_id'));
$inSelect->where(new \Zend\Db\Sql\Predicate\IsNotNull('last_login_on'));
$inSelect->group('op_id');
$inSelect->order(array('op_id' => 'asc'));
$inSelect->having(new \Zend\Db\Sql\Predicate\Expression('SUM(IF(DATE(last_login_on) > DATE(DATE_SUB(NOW(), INTERVAL 31 DAY)), 1, 0)) = 0'));

$inExpression = new In('op_id', $inSelect);
$select->where($inExpression);
$select->where(array('role_type' => 'owner'), PredicateSet::OP_AND);

echo $select->getSqlString();

这应该回显这样的字符串:

SELECT 
user.*
FROM
user
WHERE
op_id IN (
SELECT
user.op_id AS op_id
FROM
user
WHERE
last_login_on IS NOT NULL
GROUP BY op_id
HAVING SUM(IF(DATE(last_login_on) > DATE(DATE_SUB(NOW(), INTERVAL 31 DAY)),
1,
0)) = 0
ORDER BY op_id ASC
)
AND role_type = 'owner'

编辑:

ZF2 版本:2.4.9

关于php - Zend2 Db\Select 带有带 HAVING 的动态 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983666/

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