Có vẻ như bạn cần một tổng hợp nhiều hơn nữa. Sử dụng các
MAX()
tổng hợp về giá trị
cnt
của bạn và
GROUP BY placeId, userVotedId
:
SELECT placeId, userVotedId, max(cnt)
FROM
(
SELECT uvo.userVotedId, p.placeId, count(*) as cnt
FROM users as u
INNER JOIN users_votes as uvo
ON u.userId = uvo.userVotedId
INNER JOIN places as p
ON p.placeId = uvo.placeId
GROUP BY userVotedId, placeId
) AS RESULT
GROUP BY placeId, userVotedId
Lưu ý: tôi đã thay đổi truy vấn của bạn để sử dụng cú pháp
JOIN
thay cho dấu phẩy giữa các bảng.
Chỉnh sửa, dựa trên nhận xét của bạn sau nên làm việc:
select total.uservotedid,
total.placeid,
total.cnt
from
(
SELECT uvo.userVotedId, p.placeId, count(*) as cnt
FROM users as u
INNER JOIN users_votes as uvo
ON u.userId = uvo.userVotedId
INNER JOIN places as p
ON p.placeId = uvo.placeId
GROUP BY userVotedId, placeId
) total
inner join
(
select max(cnt) Mx, placeid
from
(
SELECT uvo.userVotedId, p.placeId, count(*) as cnt
FROM users as u
INNER JOIN users_votes as uvo
ON u.userId = uvo.userVotedId
INNER JOIN places as p
ON p.placeId = uvo.placeId
GROUP BY userVotedId, placeId
) mx
group by placeid
) src
on total.placeid = src.placeid
and total.cnt = src.mx
Xem SQL Fiddle with Demo
Kết quả là:
| USERVOTEDID | PLACEID | CNT |
-------------------------------
| 65 | 11 | 1 |
| 67 | 13 | 1 |
| 67 | 25 | 1 |
| 67 | 51 | 2 |
Chỉnh sửa # 2, nếu bạn muốn có một số ngẫu nhiên trả lại nếu có cà vạt, thì bạn có thể sử dụng biến người dùng:
select uservotedid,
placeid,
cnt
from
(
select total.uservotedid,
total.placeid,
total.cnt,
@rownum := case when @prev = total.placeid then @rownum+1 else 1 end rownum,
@prev := total.placeid pplaceid
from
(
SELECT uvo.userVotedId, p.placeId, count(*) as cnt
FROM users as u
INNER JOIN users_votes as uvo
ON u.userId = uvo.userVotedId
INNER JOIN places as p
ON p.placeId = uvo.placeId
GROUP BY userVotedId, placeId
) total
inner join
(
select max(cnt) Mx, placeid
from
(
SELECT uvo.userVotedId, p.placeId, count(*) as cnt
FROM users as u
INNER JOIN users_votes as uvo
ON u.userId = uvo.userVotedId
INNER JOIN places as p
ON p.placeId = uvo.placeId
GROUP BY userVotedId, placeId
) mx
group by placeid
) src
on total.placeid = src.placeid
and total.cnt = src.mx
order by total.placeid, total.uservotedid
) src
where rownum = 1
order by placeid, uservotedid
Xem SQL Fiddle with Demo
những gì bạn nhận được và những gì bạn muốn là giống hệt nhau. Vì vậy, truy vấn của bạn hoạt động! – cha
@cha Tôi nghĩ như vậy, nhưng vấn đề là để loại bỏ các placeid đôi = 51. Có thể có nhiều cách dễ hiểu hơn để chỉ ra điều này thay vì bốn hộp màu đỏ gập ghềnh ;-) – KekuSemau
Nếu bạn đang cố gắng để có được đầu hàng dựa trên cnt khi bạn đã thêm nhóm theo placeID của kết quả của bạn, đây là một vấn đề khó khăn hơn lần đầu tiên xuất hiện. Trong SQL Server, tôi nghĩ rằng bạn có thể thực hiện điều này với APPLY, nhưng điều đó không được hỗ trợ (?) Trong MySQL. – Matthew