MySQL은 당신이보고, 불평하지 않고 오히려 특별한 방법으로 group by
를 사용 할 수 있습니다 documentation : ONLY_FULL_GROUP_BY을 사용하지 않으면
이
, GROUP BY의 표준 SQL 사용에 대한 MySQL의 확장 HAVING, 선택 목록을 허용 조건 또는 ORDER BY 목록을 사용하여 열이 GROUP BY 열에 기능적으로 종속되어 있지 않더라도 비 집합 열을 참조 할 수 있습니다. [...] 이 경우 서버는 각 그룹에서 임의의 값을 자유롭게 선택할 수 있으므로 동일하지 않으면 선택한 값이 불확실합니다. 이는 사용자가 원하는 값이 아닐 수 있습니다..
이 동작은 MySQL 5.7 이전의 기본 동작이었습니다. 이 특정 noteID
에 대한 tasteNoteRate
에 하나 개 이상의 행이, 그래서 다른 사람이 이미 집계 함수없이 tasteNoteRate.userVoting
을 사용한다는 점에 유의 userScored
, 투표 한 경우, 기반 될 경우, 의미 귀하의 경우에는
무작위 행 - 잘못된 행.
당신은 집계 사용하여 해당 문제를 해결할 수 : (null
이외로) 비교의 결과가 1 또는 0이기 때문에,
select ...,
max(CASE
WHEN tasteNoteRate.userVoting = 1162 THEN 1
ELSE 0
END) AS userScored
from ...
또는, 당신은 또한 짧은 버전을 사용할 수 있습니다 :
를
select ...,
coalesce(max(tasteNoteRate.userVoting = 1162),0) AS userScored
from ...
는 MySQL을 5.7으로 업그레이드 준비 (및 ONLY_FULL_GROUP_BY
를 사용) 할로해야 당신의 select
-list에 이미 group by
모든 비 집계 열 : group by tastingNotes.userID, tastingNotes.beerID, tastingNotes.noteID, tastingNotes.note
. 이 또한
select tastingNotes.*,
coalesce(rates.count, 0) as count,
coalesce(rates.userScored,0) as userScored
from tastingNotes
left join (
select tasteNoteRate.noteID,
sum(tasteNoteRate.Score) as count,
max(tasteNoteRate.userVoting = 1162) as userScored
from tasteNoteRate
group by tasteNoteRate.noteID
) rates
on tastingNotes.noteID = rates.noteID and rates.userScored = 0
where tastingNotes.userID != 1162
order by count;
: 당신이 group by
에 tastingNotes
의 모든 열을하지 않아도
(다른 사람의 사이에) 쿼리를 작성하는 다른 방법은 하위 쿼리에 tastingNoteRates
의 그룹화를 수행하는 것 on
절의 rates.userScored = 0
을 = 1
으로 변경하여 사용자가 투표 한 메모를 가져올 수 있습니다.
SQL92 준수'GROUP BY'를 읽어 보시기 바랍니다. – Kermit
정확히 무엇을 찾아야합니까? Kermit – Mike
나는이 시도뿐만 아니라 달성하려는 것에 대한 설명을 제시하는 것이 유용 할 수도 있다고 생각합니다. 당신이 예상대로 작동하지 않습니다. 이 특정 접근법은 완전히 잘못 인도 될 수 있으며 수행하려는 작업을 수행하는 더 간단한 방법이 될 수 있습니다. – moreON