2016-07-08 1 views
3

以下のクエリは、多くのジョインテーブルとDB :: rawクエリを使用しており、期待どおりに動作しています。私はテーブルにURLが格納されているフィールドである "着陸"をgroupByしたいと思います。 しかし、パラメータなしでURLをグループ化したいと思います。どうすればこれを達成できますか?Laravelでは、どのようにクエリでパラメータなしでURLをグループ化しますか

以下のクエリはSUBSTRING_INDEXを使用しようとしましたが、機能しませんでした。

$adverts = DB::table('adverts')      
       ->select(DB::raw('count(*) as total'),DB::raw('(SELECT DATE_FORMAT(max(instances.date), \'%d-%m-%Y\') FROM instances WHERE instances.ad_uid = adverts.ad_uid ORDER BY id DESC limit 1) AS Last_seen_date,' 
         . '(SELECT instances.country FROM instances WHERE instances.ad_uid = adverts.ad_uid ORDER BY id DESC limit 1) AS country,' 
         . '(SELECT advertsstorage.filename FROM advertsstorage where uid_dir = adverts.ad_uid ORDER BY id ASC limit 1) AS filename,' 
         .'(SELECT IF(ext = \'jpeg\', CONCAT(fullpath, \'_1.\', ext), (CONCAT(fullpath,\'.\',ext))) as fullpath FROM advertsstorage where uid_dir = adverts.ad_uid ORDER BY id ASC limit 1)as fullpath, adverts.*')) 
       ->join('domains','adverts.domain', '=' ,'domains.domain') 
       ->join('advertiser_domains','domains.id', '=' ,'advertiser_domains.domain_id') 
       ->join('advertisers','advertiser_domains.advertiser_id', '=' ,'advertisers.u_id') 
       ->where('advertisers.u_id', '=',$advertiserID) 
       ->orderBy('Last_seen_date', 'DESC') 
       ->groupBy(DB::raw("SUBSTRING_INDEX(adverts.landing,'?',1)"))      
      ->get(); 
+0

+1。 Laravel groupByをパラメータで使用する方法を理解しましたか?私は今この同じ問題によってブロックされています。ありがとう! – Ryan

答えて

1

私はそれを考え出したと思うし、今ではLaravelはgroupByでパラメータを提供しないように私には理にかなっています。

まず、MySql Group Byについてのリサーチャーが必要でした。

selectに記載されているすべてのフィールドは、groupByに入力したものと互換性がある必要があります。

そして、あなたが使用することができます。 ->groupBy(DB::raw('some_alias'))

私の場合:

$statsQuery = DB::table('contacts') 
       ->selectRaw("SUBSTR(DAYNAME(CONVERT_TZ(created_at, 'UTC', ?)), 1, 3) AS 'DayOfWeek', HOUR(CONVERT_TZ(created_at, 'UTC', ?)) AS 'Hour', COUNT(id) AS 'CallsScheduled'", [$reportingClientTimeZone, $reportingClientTimeZone]) 
       ->whereIn('adId', $adIds) 
       ->whereRaw("CONVERT_TZ(created_at, 'UTC', ?) >= STR_TO_DATE(?, '%Y-%m-%d')", [$reportingClientTimeZone, $startDate]) //https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert-tz 
       ->whereRaw("CONVERT_TZ(created_at, 'UTC', ?) < DATE_ADD(STR_TO_DATE(?, '%Y-%m-%d'), INTERVAL 1 day)", [$reportingClientTimeZone, $endDate]) //Given a certain endDate (which begins at midnight), only include results LESS THAN 1 day after that midnight 
       ->whereNotNull('clarityCallTimeUtc') 
       ->groupBy(DB::raw("DayOfWeek, Hour")); 

COUNT()が私の唯一の集約関数がどのように参照してください?そして私のselectで言及されている唯一の他のフィールドは、groupByの私が使っているもの(別名)です。

これは私のために働いていると思います。

関連する問題