想象一下,您有一个这样的表模式:
+-------------+--------+
| 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魔术,但是仍然没有运气。每次尝试仅返回后备版本或仅翻译后的行。
感谢您的帮助。
答案 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
中的作业的一行似乎被隐藏了,该作业被整体隐藏了。