gpt4 book ai didi

mysql - 使用 date_sub 阐明数据库查询

转载 作者:行者123 更新时间:2023-11-29 07:46:24 26 4
gpt4 key购买 nike

我正在努力使用 Illuminate 数据库查询生成器进行查询。当我使用查询时,结果并不符合我的预期。当直接使用 mysql cli 使用查询日志中的查询时,我得到了预期的结果。

使用查询生成器:

    ->table('CompanyTools')
->select(
'CompanyTools.toolId',
$db->raw('COUNT(CompanyTools.toolId) as count')
)
->whereYear('CompanyTools.date', '>', 'YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))')
->groupBy('CompanyTools.toolId')
->orderBy('count', 'DESC')
->take(1)
->get();

结果:

Array ( [toolId] => 88 [count] => 55 )  

使用 mysql cli:

select `CompanyTools`.`toolId`, COUNT(CompanyTools.toolId) as count from `CompanyTools` 
where year(`CompanyTools`.`date`) > YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
group by `CompanyTools`.`toolId`
order by `count` desc
limit 1

结果:

ToolId: 88
count: 17

如果我(在查询生成器中)将 'YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))' 替换为 2013 我得到:

Array ( [toolId] => 88 [count] => 17 )  

不知何故,date_sub 被忽略,因此结果包括所有年份

我尝试使用 ->whereYear('CompanyTools.date', '>', $db->raw('YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))'))没有任何运气。

我想我可以使用 php 来计算所需的年份,但我宁愿得到正确的查询。

提前致谢

/j

更新

更换

->whereYear('CompanyTools.date', '>', 'YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))')

->where($db->raw('YEAR(CompanyTools.date)'), '>', $db->raw('YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))'))

解决了。不够聪明,无法找出原因,但也许 whereYear 函数应该以不同的方式使用

最佳答案

正如您已经发现的那样

->where($db->raw('YEAR(CompanyTools.date)'), '>', $db->raw('YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))'))

或者另一种选择

->whereRaw('YEAR(CompanyTools.date) > YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))')

解决了问题。

但这是为什么呢?

对于每个“正常”查询,Laravel 使用绑定(bind)。显然,像 YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR)) 这样的 SQL 函数不适用于绑定(bind)。

通常,您可以使用 DB::raw('YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))') 并且 Laravel 不会使用绑定(bind)。例如在 where() 中(表达式是 DB::raw() 返回的类)

if ( ! $value instanceof Expression)
{
$this->addBinding($value, 'where');
}

但是 whereYear() 函数不会做这样的事情。它使用 addDateBasedWhere() 并仅添加绑定(bind),而不检查该值是否是 Expression

的实例
protected function addDateBasedWhere($type, $column, $operator, $value, $boolean = 'and')
{
$this->wheres[] = compact('column', 'type', 'boolean', 'operator', 'value');

$this->addBinding($value, 'where');

return $this;
}

这意味着查询将使用绑定(bind),因此根本不执行日期计算。

关于mysql - 使用 date_sub 阐明数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27676552/

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