この問題は、GROUP BY
の動作に対するMySQL固有の拡張が原因です。 句。他のデータベースはエラーをスローします...SELECTリストのon-aggregateに似ています」(sql_modeにONLY_FULL_GROUP_BYを含めると、MySQLに同様のエラーをスローさせることができます。)
式messages.created
の問題 これは、GROUPBYの不確定な行の値を参照します。 ORDER BY操作は、GROUP BY操作の後、処理のかなり後の段階で発生します。
グループごとに作成された「最新」を取得するには、集計を使用します 式MAX(messages.created)
。
同じ行から他の値を取得するには、もう少し複雑です。
created
と仮定します ユニーク 指定されたconversation_id
内 グループ(または、一意でないことが保証されておらず、created
に対して同じ値を持つ複数の行を返しても問題ない場合。 ...
最新のcreated
を取得するには 各conversation_id
に対して
SELECT lm.conversation_id
, MAX(lm.created) AS created
FROM conversation lc
JOIN message lm
ON lm.conversation_id = lc.id
WHERE (lc.creator_id = :userId OR lc.to_id = :userId)
GROUP BY lm.conversation_id
これをインラインビューとして使用して、最新のcreated
を含む行全体を取得できます。
SELECT c.*
, m.*
FROM ( SELECT lm.conversation_id
, MAX(lm.created) AS created
FROM conversation lc
JOIN message lm
ON lm.conversation_id = lc.id
WHERE (lc.creator_id = :userId OR lc.to_id = :userId)
GROUP BY lm.conversation_id
) l
JOIN conversation c
ON c.id = l.conversation_id
JOIN messages m
ON m.conversation_id = l.conversation_id
AND m.created = l.created
WHERE (c.creator_id = :userId OR c.to_id = :userId)
注:
ORDER BY
を追加できます 返される行を必要に応じて並べ替える句。
WHERE
外側のクエリの句は冗長であり、不要である可能性があります。
SELECT *
の使用は避けてください 、および返される式を明示的にリストすることを好みます。