Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybór wierszy na podstawie kilku zasad

W tym demo zebrałem wszystkie przypadki testowe na tym samym stole. Tutaj możesz sprawdzić poprawny wynik dla przypadków 1,2,3 dla przypadku 4,5 musisz zmienić @language := 'de' do 'es' .

Aby Twoja ostateczna wersja nie potrzebowała @partition , tylko @user .

Zasadniczo jest to to samo rozwiązanie, co @Gordon, ale ponieważ nie możesz użyć row_number() emulujemy to za pomocą zmiennych użytkownika.

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

WYJŚCIE

używając @language := 'de' dla pierwszych 3 przypadków testowych.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NullPointerException — problem związany z zablokowaniem bazy danych podczas pobierania danych z bazy danych i przechowywania w tablicy

  2. PHP/MySQL - pokaż obraz z obiektu blob

  3. @BindBean JDBI nie znajduje nazwanych parametrów w klasie fasoli podczas INSERT

  4. Jak ustawić bieżącą datę na kolumnę daty MySQL z Javy?

  5. Pobierz identyfikatory obecnych użytkowników z bazy danych, aby użyć ich w nowej tabeli