2017-10-09 48 views
0

我试图在Laravel 5.5运行以下查询:复杂雄辩SQL

select `colours`.`id` AS `id` 
    ,`colours`.`description` AS `description` 
    ,`vehicle_colour_and_trims`.`colour_id` AS `colour_id` 
    ,`colours`.`code` AS `code` 
    ,`vehicle_options`.`basic_price` AS `basic_price` 
    ,`vehicle_options`.`mrp` AS `mrp` 
    ,`vehicle_options`.`vat` AS `vat` 
from ((`vehicle_colour_and_trims` 
join `colours` 
    on ((`vehicle_colour_and_trims`.`colour_id` = `colours`.`id`))) 
join `vehicle_options` 
    on ((`colours`.`option_id` = `vehicle_options`.`option_id`))) 
WHERE vehicle_colour_and_trims.vehicle_id = 116922 
group by `colours`.`code` 
order by `colours`.`description` 

这东西是超越雄辩?

+2

不确定为什么你需要一个没有聚合的组。 – xQbert

+0

你会得到错误吗?你不期望的结果? – Randy

+0

在没有任何聚合函数的情况下,您的GROUP BY子句可能会返回错误和/或意外(即不确定)结果。另外,什么是'增值税'? – Strawberry

回答

0

如果要执行复杂的查询,laravel提供了查询生成器工具,则可以使用DB外观上的表方法来开始查询。

在你的控制器,你就必须添加以下行使用DB门面:

use Illuminate\Support\Facades\DB; 

要执行的查询将被修建这样的:

$query = DB::table('vehicle_colour_and_trims') 
      ->join('colours', 'vehicle_colour_and_trims.colour_id', '=','colours.id') 
      ->join('vehicle_options', 'colours.option_id', '=','vehicle_options.option_id')  
      ->select('colours.id AS id', 
         'colours.description AS description', 
         'vehicle_colour_and_trims.colour_id AS colour_id', 
         'colours.code AS code', 
         'vehicle_options.basic_price AS basic_price', 
         'vehicle_options.mrp AS mrp', 
         'vehicle_options.vat AS vat') 
      ->where('vehicle_colour_and_trims.vehicle_id','=', 116922) 
      ->groupBy('colours.code') 
      ->orderBy('colours.description', 'desc') 
      ->get(); 

你可以阅读更多关于laravel文档中的查询生成器的信息

https://laravel.com/docs/5.5/queries

使用此查询会出现SQLSTATE [42000]错误,因为在mysql中默认启用了sql_mode = ONLY_FULL_GROUP_BY **,这意味着MySQL会拒绝选择列表,HAVING条件或ORDER BY引用非聚合列的查询没有在GROUP BY子句中命名或在功能上依赖于它们。

为了添加到选择列表列,而无需将其添加到GROUP_BY条款,你必须使用的函数ANY_VALUE()为每个不必存在的子句中的列的,试试这个:

$query = DB::table('vehicle_colour_and_trims') 
     ->join('colours', 'vehicle_colour_and_trims.colour_id', '=','colours.id') 
     ->join('vehicle_options', 'colours.option_id', '=','vehicle_options.option_id')  
     ->select(DB::raw('ANY_VALUE(colours.id) AS id, 
          ANY_VALUE(colours.description) AS description, 
          ANY_VALUE(vehicle_colour_and_trims.colour_id) AS colour_id, 
          colours.code AS code, 
          ANY_VALUE(vehicle_options.basic_price) AS basic_price, 
          ANY_VALUE(vehicle_options.mrp) AS mrp, 
          ANY_VALUE(vehicle_options.vat) AS vat')) 
     ->where('vehicle_colour_and_trims.vehicle_id','=', 116922) 
     ->groupBy('colours.code') 
     ->orderBy('colours.description', 'desc') 
     ->get(); 

的DB ::原始()函数允许您创建原始表达式

更多信息:

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

我有一个错误 SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚集列'cl24-ids.colours.id',它在功能上依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by不兼容 – Jim