그래서이 쿼리는 HeidiSQL에서 제대로 실행되지만 Laravel에서는 엄격한 모드 (및보다 구체적으로 아마 때문에 ONLY_FULL_GROUP_BY
가 설정되는 SQL 모드)의 :"그룹화하지 않는 필드없이"SUM을 HAVING하는 방법 "HAVING 절에 x가 사용되었습니다."
SELECT
project.id
'Project code',
SUM(report.hours)
'Total hours',
SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END)
'Total report hours'
FROM report
INNER JOIN project ON project.id = report.id
WHERE report.date <= :report_end
GROUP BY
project.id
HAVING
`Total report hours` != 0
그것은 나에게 다음과 같은 오류 제공 :
Syntax error or access violation: 1463 Non-grouping field 'Total report hours' is used in HAVING clause
내가 주변 검색을 시도했습니다,하지만 내가 찾을 수있는 모든 질문의 이동에 의해 해결된다 필터는 HAVING
에서 WHERE
까지 가능합니다. 이러한 경우에는 실제로 집계 함수가 포함되지 않습니다. 그러나, 나의 경우에는, 그것이, 그리고 이것이 정확히 HAVING
무엇을위한 줄 알았는데? 나는. 보고 기간에 시간이없는 모든 행을 필터링하려고합니다.
내가 대신 대신에 다음과 같이 전체 SUM
을 반복, Total report hours
을 참조하는하여 "해결"할 수 있습니다
HAVING
SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END) != 0
을하지만 이미 계산 때 그것은 매우 불필요하고 지저분한 느낌 (내 관점에서 보기)를 사용할 수 있습니다.
자신을 반복하지 않고도 엄격한 모드에서 작동하는 표현 방법이 있습니까?
SELECT p.id as 'Project code',
SUM(r.hours) as 'Total hours',
SUM(CASE WHEN r.date BETWEEN :report_start AND :report_end THEN r.hours END) as 'Total report hours'
FROM report r INNER JOIN
project p
ON p.id = r.id
WHERE r.date <= :report_end
GROUP BY p.id
HAVING SUM(CASE WHEN r.date BETWEEN :report_start AND :report_end THEN r.hours END) <> 0;
난 당신이 열 별칭에 대한 작은 따옴표를 사용하지 권합니다 : 일부 데이터베이스에서
어떤 버전의 MySQL입니까? bugs.mysql.com에서보고 할 수있는 버그와 같은 냄새가납니다. –
@RickJames MariaDB 10.2 믿을 만하다. (하지만 내일까지 일할 때까지는 확인할 수 없다.) – Svish