Когда две строки имеют одинаковое значение столбца, выберите строку на основе второго столбца - PullRequest
0 голосов
/ 20 января 2019

Представьте, что у вас есть такая схема таблицы:

+-------------+--------+
|    jobs     | t_jobs |
+-------------+--------+
| id          | id     |
| category_id | job_id | t_jobs.job_id = jobs.id
|             | locale |
|             | status |
+-------------+--------+

В приложении резервный языковой стандарт установлен на «pl».Приложение загружает данные для текущей установленной локали, но если в этой локали нет данных, оно должно загружать данные из резервной локали ('pl').

Теперь у вас есть 3 ситуации:

1) t_jobs.locale = "en" и t_jobs.status = "Опубликовал" и строк следующим образом:

+----------------------------------+
|               t_jobs             |
+----+--------+--------+-----------+
| id | job_id | locale |  status   |
+----+--------+--------+-----------+
|  1 |      1 | pl     | published |
|  2 |      1 | en     | published |
|  3 |      2 | pl     | published |
+----+--------+--------+-----------+

результатдолжно быть:

+----+--------+--------+-----------+
| id | job_id | locale |  status   |
+----+--------+--------+-----------+
|  2 |      1 | en     | published |
|  3 |      2 | pl     | published |
+----+--------+--------+-----------+

2) t_jobs.locale = "en" и t_jobs.status = "Опубликовал" и строк следующим образом:

+----------------------------------+
|               t_jobs             |
+----+--------+--------+-----------+
| id | job_id | locale |  status   |
+----+--------+--------+-----------+
|  1 |      1 | pl     | published |
|  2 |      1 | en     | hidden    |
|  3 |      2 | pl     | published |
+----+--------+--------+-----------+

результат должен быть:

+----------------------------------+
|               result             |
+----+--------+--------+-----------+
| id | job_id | locale |  status   |
+----+--------+--------+-----------+
|  3 |      2 | pl     | published |
+----+--------+--------+-----------+

3) t_jobs.locale = "en" и t_jobs.status = "Опубликовал" и строк следующим образом:

+----------------------------------+
|               t_jobs             |
+----+--------+--------+-----------+
| id | job_id | locale |  status   |
+----+--------+--------+-----------+
|  1 |      1 | pl     | published |
|  2 |      1 | en     | hidden    |
|  3 |      2 | pl     | hidden    |
+----+--------+--------+-----------+

результат должен быть:

+----------------------------------+
|               result             |
+----+--------+--------+-----------+
|             0 records            |
+----------------------------------+

План мечты состоит в том, чтобы выбрать строки в текущей локали ("en"), которые соответствуют критериям поиска, и

Если у нас есть две строки с одинаковым t_jobs.job_id, тогда мы должны выбрать где t_jobs.locale = "en" (переведено) Иначе у нас есть одна строка с таким же t_jobs.job_id, тогда мы должны выбрать, где t_jobs.locale = "pl" (отступление)

Есть ли способ достичь такого результата?Я целый день пробовал немного магии mysql, но все еще безуспешно.Каждая попытка возвращает только резервные версии или только переведенные строки.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 20 января 2019

Вы можете использовать подзапрос из t_jobs, где вы группируете по заданию. С max(locale = 'en') вы можете создать флаг, который указывает, имеет ли задание английскую локаль. Используйте HAVING NOT max(status <> 'published') для фильтрации заданий, у которых один статус не равен опубликованному. Затем присоединитесь t_jobs к работе и языку. Если флаг указывает на наличие английского языка, выберите английский, в противном случае - польский. Для этого используйте CASE.

SELECT t2.*
       FROM (SELECT t1.job_id,
                    max(locale = 'en') has_locale
                    FROM t_jobs t1
                    GROUP BY t1.job_id
                    HAVING NOT max(status <> 'published')) x
            INNER JOIN t_jobs t2
                       ON t2.job_id = x.job_id
                          AND t2.locale = CASE
                                            WHEN x.has_locale THEN
                                              'en'
                                            ELSE
                                              'pl'
                                          END;

Однако следует рассмотреть возможность перемещения статуса в таблице jobs, так как, как только кажется, что одна строка для задания в t_jobs скрыта, задание скрывается как целое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...