首页 > 解决方案 > 当两行的列值相等时,根据第二列选择行

问题描述

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

+-------------+--------+
|    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,那么我们应该选择 where t_jobs.locale = "en"(翻译)否则我们有一行具有相同的 t_jobs.job_id,那么我们应该选择 where t_jobs.locale = "pl"(倒退)

有没有办法达到这样的结果?我一整天都在尝试一些 mysql 魔术,但仍然没有运气。每次尝试仅返回后备版本或仅返回已翻译的行。

谢谢你的帮助。

标签: mysqlsql

解决方案


您可以使用t_jobs按作业分组的子查询。max(locale = 'en')您可以创建一个标志,指示作业是否具有英语语言环境。用于HAVING NOT max(status <> 'published')过滤状态不等于已发布的作业。然后加入t_jobs工作和语言环境。如果标志表明存在英语语言环境,则选择英语语言环境,否则选择波兰语语言环境。使用 aCASE来做到这一点。

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隐藏了作业的一行,该作业就会作为一个整体被隐藏。


推荐阅读