このデモでは、すべてのテストケースを同じテーブルにまとめました。ここで、ケース1、2、3の正しい結果を確認できます。ケース4、5の場合は、変更が必要です。@language := 'de'
'es'
へ 。
最終バージョンでは、@partition
は必要ありません 、@user
のみ 。
基本的にこれは@Gordonと同じソリューションですが、row_number()
を使用できないためです。 ユーザー変数を使用してエミュレートします。
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;
出力
@language := 'de'
を使用 最初の3つのテストケース。
| 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 |