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

标签 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)

自然地,当它返回的数据不为空时,该数据应该被用作最终结果。这让我想到了案例。我将如何实现案例以这种方式工作?以下内容就足够了吗?

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)

最佳答案

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

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)

关于具有多个左外连接的 Mysql 案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11413641/

相关文章:

sql - 通过 R 连接到 Azure SQL

mysql - SQL 获取指定列表的第一个

php - 如何通过恒定的上传路径上传多个图像

mysql - 返回至少有 2 个不同订单的员工,其中订单中某些产品的数量 >= 5

php - 如何防止 PHP 中的 SQL 注入(inject)?

mysql - 如何在mysql存储过程中循环日期时间

SQL Server 2012 数据透视表

php - 使用Php注册时如何防止用户名重复?

php - 在php中选择特定行中的特定按钮

php - 空字段或空白字段或空字段未显示在 php 代码中