2017-10-09 75 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