MySQLはあなたがdocumentationを参照してください、文句なしにかなり特別な方法でgroup by
を使用することができます:
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