mysql - 当两行的列值相等时,根据第二列选择行
问题描述
想象一下,你有这样一个表模式:
+-------------+--------+
| 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 魔术,但仍然没有运气。每次尝试仅返回后备版本或仅返回已翻译的行。
谢谢你的帮助。
解决方案
您可以使用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
隐藏了作业的一行,该作业就会作为一个整体被隐藏。
推荐阅读
- apache - Docker apache图像,将日志存储在主机中?
- arrays - 数学运算二维数组中的单个元素 - Swift
- javascript - 布尔变量命名规则
- android - 无法在android studio中构建apk
- node.js - 使用 modbus-serial 库将 nodejs modbus-rtu 部署到 HEROKU
- c# - 为什么引用的类验证属性不活动?
- python-requests - Python获取请求打印特定键和值
- youtube-api - 已达到 YouTube 数据 API 限制!我怎样才能增加这个限制?
- c - cmocka.h:虽然安装了 cmocka,但没有这样的文件或目录——IBM watson 嵌入式 C 客户端库
- java - 为什么 bigDecimal 的 scale() 方法与 stripTrailingZeros() 方法结合时返回负值?