具有多个左外连接的Mysql案例

时间:2012-07-10 12:47:22

标签: mysql sql

我正在尝试以下想法。我试图在单个查询中构建一个回退系统。以下是一些背景信息:

posts_table
id, timestamp

posts_content_table
id, post_id, language_id, title, description

此处的目标是在同一查询中查询posts_table,使用回退系统加入posts_content_table。因此,如果我使用不存在的language_id搜索帖子内容,它应该能够回退到包含内容的language_id。它应该允许多级回退。

示例:

SELECT p.id FROM posts_table AS p 

LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=1)
LEFT OUTER JOIN posts_content_table AS pc2 ON (p.id=pc2.post_id AND pc2.language_id=2)
LEFT OUTER JOIN posts_content_table AS pc3 ON (p.id=pc3.post_id AND pc3.language_id=3)

当然会发生什么,当它返回非空数据时,该数据应该用作最终结果。所以这就把我带到了CASES。我如何以这种方式实现CASES?以下是否足够?

SELECT p.id, CASE title
WHEN pc.title is Null THEN pc2.title
WHEN pc2.title is Null THEN ps3.title
WHEN pc3.title is Null THEN '-'
END
FROM posts_table AS p 

LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=1)
LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=2)
LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=3)

1 个答案:

答案 0 :(得分:3)

这是COALESCE()的目的,它返回其参数的第一个非null:

SELECT 
  p.id, 
  COALESCE(pc.title, pc2.title, pc3.title, '-') AS title
FROM posts_table AS p 
LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=1)
LEFT OUTER JOIN posts_content_table AS pc2 ON (p.id=pc2.post_id AND pc2.language_id=2)
LEFT OUTER JOIN posts_content_table AS pc3 ON (p.id=pc3.post_id AND pc3.language_id=3)

(注意:我修复了表别名 - 它们都是pc,我认为你的别名为pc, pc2, pc3