【发布时间】:2018-03-05 22:05:21
【问题描述】:
我有这个问题:
SELECT p.ID
, p.post_title
, tr.trid
, tr.language_code
FROM ts_posts AS p
LEFT
JOIN ts_icl_translations AS tr
ON tr.element_id = p.ID
AND tr.language_code IN ('en', 'us')
WHERE p.post_status='publish'
AND p.post_type IN ('teaching-resource', 'post')
ORDER
BY p.post_date DESC;
它返回帖子列表。有些帖子有一个语言版本 - en,其他帖子有例如 2 个语言版本 - en 和 us。
帮助我修改该查询以在条件下返回行: 如果 post 有一个 lang 返回一行 如果帖子有更多的语言版本返回我们(或者它应该是一个查询参数)
结果应该是这样的:
更新: 我已经修改了查询。它返回的正是我正在寻找的,没有子查询和拥有。
SELECT p.ID
, p.post_title
, tr.trid
, tr.language_code
FROM ts_posts AS p
LEFT
JOIN ts_icl_translations AS tr
ON tr.element_id = p.ID
AND tr.language_code IN ('en', 'us')
LEFT JOIN ts_icl_translations AS tr2
ON tr.trid = tr2.trid AND tr2.language_code = 'us'
LEFT JOIN ts_posts AS p2 On p2.ID = tr2.element_id
WHERE p.post_status='publish'
AND p.post_type IN ('teaching-resource', 'post')
AND tr.language_code = IFNULL(tr2.language_code, 'en')
ORDER
BY p.post_date DESC;
结果
【问题讨论】:
-
请注意,没有人使用 RIGHT JOIN。它通常被认为比它的左对应物更难掌握
-
@Strawberry ok,修改为 LEFT JOIN
-
GL好像有这个,但如果你还在苦苦挣扎,见见Why should I provide an MCVE for what seems to me to be a very simple SQL query
-
@Strawberry 我找到了解决办法,谢谢
-
随时发布答案并接受它。这就是这个网站的运作方式。
标签: mysql sql performance query-optimization