Ниже приведен запрос с большим количеством таблицы соединений и DB :: raw query, который работает как ожидалось. Я хотел бы groupBy «посадка», которая является полем в таблице, имеет URL-адрес. Но я хотел бы groupBy 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();
Я думаю, что я понял это, и теперь для меня имеет смысл, что 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
.
Я думаю, что это работает на меня.