mysql - 根据条件执行多个左连接并获取非空列值

标签 mysql sql join left-join

我有一个表,其中包含网站上发布的最新评论,我想根据评论类型加入不同的表。

评论表类似于此结构:

id | type | ressource_id |
---+------+--------------+
1  |  1   |      10      |
2  |  3   |       7      |
3  |  3   |      12      |
4  |  1   |      22      |
5  |  4   |      22      |
6  |  5   |      23      |

新闻表:

news_id | notes|     date     |
--------+------+--------------+
10      |      |  2015-08-12  |
22      |      |  2015-07-12  |

教程表:

tuto_id | notes|     date     |
--------+------+--------------+
7       |      |  2015-06-15  |
12      |      |  2015-05-14  |

...类型 = 4, 5, 6 的类似表格

现在为了获得具体的评论,我正在两个表上进行左连接。

SELECT co.*
  FROM Comments co
       LEFT JOIN News n 
              ON co.id = n.news_id AND co.type = 1
       LEFT JOIN Tutorial t
              ON co.id = t.tuto_id AND co.type = 3
 WHERE (co.type IN (1,3)) 

我有兴趣从左表中获取日期。如何将该列包含在输出列表中。

所需结果:(加入表的日期)

id | type | ressource_id |     date     |
---+------+--------------+--------------+
1  |  1   |      10      |  2015-08-12  |
2  |  3   |       7      |  2015-06-15  |
3  |  3   |      12      |  2015-05-14  |
4  |  1   |      22      |  2015-07-12  |

谢谢。

最佳答案

因为您永远不会从新闻教程中获得相同评论的日期,您可能会使用COALESCE`:

SELECT co.*, COALESCE(n.date,t.date)
  FROM Comments co
       LEFT JOIN News n 
              ON co.id = n.news_id AND co.type = 1
       LEFT JOIN Tutorial t
              ON co.id = t.tuto_id AND co.type = 3
 WHERE (co.type IN (1,3))

COALESCE 将返回第一个不为 null 的参数,因此,如果有匹配的新闻,它将返回 News 中的日期,并且如果没有匹配的新闻,但有匹配的教程,它将返回教程中的日期。

关于mysql - 根据条件执行多个左连接并获取非空列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39286179/

相关文章:

PHP/MYSQL 查询帮助对结果进行分组

python - Django cursor.executemany 参数

mysql - 如何在 WordPress 中加速 GEO 搜索

mysql - 进行重命名输出条目的 SQL 查询

mysql - 如何连接同一个表来检查 a>b 是否为 10

mysql - 如何包含连接列值为 0 的 JOINS 中排除的行?

SQL Azure 和 CakePHP

sql - 子查询是重用变量的唯一选择吗?

mysql - 如何编写查询来获取主键名称

sql-server - 连接两个 SQL 表但不将行相乘