当两行具有相等的列值时,请基于第二列选择行

时间:2019-01-20 19:25:31

标签: mysql sql

想象一下,您有一个这样的表模式:

+-------------+--------+
|    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 =“ published”,行如下:

+----------------------------------+
|               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 =“ published”,行如下:

+----------------------------------+
|               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 =“ published”,行如下:

+----------------------------------+
|               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 :(得分:0)

您可以使用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中的作业的一行似乎被隐藏了,该作业被整体隐藏了。