2014-10-01 66 views
0

我想知道为什么这个查询不起作用。这是查询生成器语句:MySql查询不能使用max子句

$this->getBuilder() 
    ->select('code', 'name', 'date') 
    ->groupBy('name', 'code') 
    ->having('MAX(date)') 
    ->get() 

这将导致此错误:

SQLSTATE[HY000]: General error: 1 near "?": syntax error (SQL: select "code", "name", "date" from "rival_rates" group by "name", "code" having "MAX(date)" ) (Illuminate\Database\QueryException) 

我不知道哪里是问号,没有任何参数。

如果我通过mysql命令行运行SQL查询它的工作原理:

mysql> select code, name, date from rival_rates group by name, code having MAX(date); 
+------+------+------------+ 
| code | name | date  | 
+------+------+------------+ 
| 100 | tal | 2014-10-01 | 
| 100 | tal2 | 2014-10-05 | 
| 200 | tal2 | 2014-10-03 | 
+------+------+------------+ 
3 rows in set (0.00 sec) 

mysql> 

如果我删除它的工作“具有”部分。那有什么问题?

预先感谢您。

+0

'选择代码,名称,MAX(日)从名字rival_rates组,代号'唐'知道laravel但是这应该是您的查询 – Mihai 2014-10-01 09:59:12

+0

@Mihai我不是争论查询本身。在我的回答中,有一种方法可以执行这样的查询,而不用讨论它是否有意义。 – 2014-10-01 10:03:56

+0

你认为查询是错误的?我需要每个产品代码和不同竞争对手价格的最新价格,并且日期不会同时更新,因此日期可能会有所不同。如果有更好的方法... – 2014-10-01 10:18:26

回答

2

您需要havingRaw

$this->getBuilder() 
    ->select('code', 'name', 'date') 
    ->groupBy('name', 'code') 
    ->havingRaw('MAX(date)') 
    ->get() 
+0

在那里? – Naincy 2014-10-01 09:55:14

+0

当然,您无法做其他操作。 “拥有”并不具备这样的能力。 – 2014-10-01 09:55:55

+0

什么是查询输出? – Mihai 2014-10-01 09:58:17

0

您在语法中遇到问题。

$this->getBuilder() 
    ->select('code', 'name', 'date') 
    ->groupBy('name', 'code') 
    ->having('MAX(date)') 
    ->get() 

这里,具有第3个需要像参数->having('MAX(date)', '>=', '2014-09-25')

注意:第一个参数是列名,第二个用于比较操作符和第三是该比较值。

0
$condition = 'MAX(date)'; 

$this->getBuilder() 
    ->select('code', 'name', 'date') 
    ->groupBy('name', 'code') 
    ->having($condition) 
    ->get() 

这也行得通。如果你不想给条件赋予参数。

+0

它不会改变任何东西,它不会工作。 – 2014-10-01 09:55:23