In dieser Demo habe ich alle Testfälle auf demselben Tisch zusammengestellt. Hier können Sie das richtige Ergebnis für die Fälle 1,2,3 überprüfen, für die Fälle 4,5 müssen Sie @language := 'de'
ändern zu 'es'
.
Für Ihre endgültige Version wird @partition
nicht benötigt , nur @user
.
Im Grunde ist dies die gleiche Lösung wie @Gordon, aber weil Sie row_number()
nicht verwenden können Wir emulieren es mit Benutzervariablen.
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;
AUSGABE
mit @language := 'de'
für die ersten 3 Testfälle.
| 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 |