gpt4 book ai didi

mysql - 当两行的列值相等时,根据第二列选择行

转载 作者:行者123 更新时间:2023-11-29 16:25:14 25 4
gpt4 key购买 nike

假设您有这样一个表架构:

+-------------+--------+
| 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 魔法,但仍然没有运气。每次尝试仅返回后备版本或仅返回翻译的行。

感谢您的帮助。

最佳答案

您可以使用 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 中的作业中只有一行被隐藏 作业被整体隐藏。

关于mysql - 当两行的列值相等时,根据第二列选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com