Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Auswählen von Zeilen basierend auf einigen Regeln

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.

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;

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 |