Sự cố là do phần mở rộng dành riêng cho MySQL đối với hành vi của GROUP BY
mệnh đề. Các cơ sở dữ liệu khác sẽ gặp lỗi ... một cái gì đó tương tự như trên tổng hợp trong danh sách CHỌN ". (Chúng tôi có thể yêu cầu MySQL đưa ra một lỗi tương tự, nếu chúng tôi bao gồm ONLY_FULL_GROUP_BY trong sql_mode.)
Sự cố với biểu thức messages.created
là giá trị đề cập đến một giá trị từ một hàng không xác định trong GROUP BY. Hoạt động ORDER BY xảy ra muộn hơn nhiều trong quá trình xử lý, sau hoạt động GROUP BY.
Để nhận thông tin "mới nhất" được tạo cho mỗi nhóm, hãy sử dụng tổng hợp biểu thức MAX(messages.created)
.
Để nhận các giá trị khác từ cùng hàng đó, phức tạp hơn một chút.
Giả sử rằng created
là duy nhất trong một conversation_id
nhất định nhóm (hoặc, nếu không có gì đảm bảo rằng nó không phải là duy nhất và bạn có thể trả lại nhiều hàng có cùng giá trị cho created
...
Để tải created
mới nhất cho mỗi 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
Bạn có thể sử dụng nó làm chế độ xem nội tuyến, để lấy toàn bộ hàng với created
mới nhất đó
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)
LƯU Ý:
Bạn có thể thêm ORDER BY
mệnh đề để sắp xếp các hàng được trả về theo cách bạn cần.
WHERE
mệnh đề trên truy vấn bên ngoài có thể là thừa và không cần thiết.
Chúng tôi muốn tránh sử dụng SELECT *
và muốn liệt kê rõ ràng các biểu thức được trả về.