Thật không vui khi đọc truy vấn của bạn, nhưng tôi nghĩ vấn đề nằm ở đây:
LEFT JOIN (
SELECT max(notification_date) notification_date, client_id
FROM og_ratings
WHERE notification_date NOT IN (
SELECT max(notification_date)
FROM og_ratings
)
nếu bạn muốn ngày tối đa cho mọi khách hàng, bạn cần NHÓM THEO client_id:
SELECT client_id, max(notification_date) notification_date
FROM og_ratings
GROUP BY client_id
nếu bạn muốn mức tối đa thứ hai thì có ít tùy chọn, tôi đang sử dụng tùy chọn này dễ hiểu hơn nhưng nó không nhất thiết phải là hiệu suất cao nhất:
SELECT client_id, max(notification_date) notification_date
FROM og_ratings
WHERE
(client_id, notification_date) NOT IN (
SELECT client_id, max(notification_date)
FROM og_ratings GROUP BY client_id
)
GROUP BY client_id
vấn đề thứ ba, bạn đang sử dụng LEFT JOIN có nghĩa là bạn sẽ trả về tất cả các giá trị từ og_ratings bất kể chúng có phải là giá trị tối đa thứ hai hay không. Sử dụng INNER JOIN trong ngữ cảnh này:
SELECT
r.client_id,
c.id,
t.id,
..etc...
FROM
og_ratings r INNER JOIN (
SELECT client_id, max(notification_date) notification_2nd_date
FROM og_ratings
WHERE
(client_id, notification_date) NOT IN (
SELECT client_id, max(notification_date)
FROM og_ratings GROUP BY client_id
)
GROUP BY client_id
) r2
ON r.notification_date = r2.notification_2nd_date
AND r.client_id = r2.client_id
LEFT JOIN og_companies c ON r.client_id = c.id
LEFT JOIN og_rating_types t ON r.rating_type_id = t.id
LEFT JOIN og_actions a ON r.pacra_action = a.id
LEFT JOIN og_outlooks o ON r.pacra_outlook = o.id
LEFT JOIN og_lterms l ON r.pacra_lterm = l.id
LEFT JOIN og_sterms s ON r.pacra_sterm = s.id
LEFT JOIN pacra_client_opinion_relations pr ON pr.opinion_id = c.id
LEFT JOIN pacra_clients pc ON pc.id = pr.client_id
LEFT JOIN city ON city.id = pc.head_office_id
WHERE
r.client_id IN (
SELECT opinion_id FROM pacra_client_opinion_relations
WHERE client_id = 50
)