Nesta demonstração, reuni todos os casos de teste na mesma tabela. Aqui você pode verificar o resultado correto para os casos 1,2,3 para o caso 4,5 você precisa alterar
@language := 'de'
para 'es'
. Para sua versão final não precisará de
@partition
, apenas @user
. Basicamente, esta é a mesma solução que @Gordon, mas porque você não pode usar
row_number()
nós o emulamos usando variáveis de usuário. SQL DEMO
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;
SAÍDA
usando
@language := 'de'
para os 3 primeiros casos de teste. | 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 |