Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélection de lignes en fonction de quelques règles

Dans cette démo, j'ai rassemblé tous les cas de test sur la même table. Ici vous pouvez vérifier le bon résultat pour les cas 1,2,3 pour le cas 4,5 vous devez changer @language := 'de' en 'es' .

Pour votre version finale, vous n'aurez pas besoin de @partition , uniquement @user .

Fondamentalement, c'est la même solution que @Gordon mais parce que vous ne pouvez pas utiliser row_number() nous l'émulons en utilisant des variables utilisateur.

DÉMO SQL

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;

SORTIE

en utilisant @language := 'de' pour les 3 premiers cas de test.

| 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 |