Trong bản demo này, tôi đặt tất cả các trường hợp thử nghiệm trên cùng một bảng. Tại đây, bạn có thể kiểm tra kết quả phù hợp cho trường hợp 1,2,3 và trường hợp 4,5 bạn cần thay đổi @language := 'de'
thành 'es'
.
Đối với phiên bản cuối cùng của bạn sẽ không cần @partition
, chỉ @user
.
Về cơ bản đây là giải pháp tương tự như @Gordon nhưng vì bạn không thể sử dụng row_number()
chúng tôi mô phỏng nó bằng cách sử dụng các biến người dùng.
SELECT *
FROM (
SELECT t.*,
@rn := if (@partition = CONCAT(`test_id`, '-', `user`),
@rn + 1,
if(@partition := CONCAT(`test_id`, '-', `user`), 1, 1)
) as rn,
@partition
FROM (
SELECT *, (language = @language) AS priority
FROM Table1
CROSS JOIN (SELECT @language := 'de' as site_lang) AS var
ORDER BY CONCAT(test_id, '-', user),
priority DESC,
created
) AS t
CROSS JOIN ( SELECT @rn := 0, @partition := '' ) as var
) r
WHERE r.rn = 1;
ĐẦU RA
sử dụng @language := 'de'
cho 3 trường hợp thử nghiệm đầu tiên.
| test_id | id | title | language | created | user | site_lang | priority | rn | @partition |
|---------|----|-------|----------|----------------------|------|-----------|----------|----|------------|
| 1 | 3 | c | de | 2019-01-03T00:00:00Z | 4 | de | 1 | 1 | 1-4 |
| 2 | 1 | a | en | 2019-01-01T00:00:00Z | 4 | de | 0 | 1 | 2-4 |
| 3 | 1 | a | en | 2019-01-01T00:00:00Z | 3 | de | 0 | 1 | 3-3 |
| 3 | 3 | b | de | 2019-01-03T00:00:00Z | 4 | de | 1 | 1 | 3-4 |
| 3 | 4 | c | de | 2019-01-04T00:00:00Z | 5 | de | 1 | 1 | 3-5 |