MySQL中需要进行连接的条件列

时间:2009-12-09 10:04:36

标签: mysql conditional join

我在网站上研究了相关问题但未能找到解决方案。我所拥有的是MySQL中的用户活动表。它列出了照片社区网站中用户的所有类型的事件。根据发生的事件,我需要查询其他用户的某些数据。

我将通过两个例子以更实际的方式解释它。首先,一个简单的事件,用户加入了该网站。这就是活动表中的行的样子:

活动:注册
user_id: 19(用户表的外键)
日期:当前日期
image_id: null,因为此事件与图像

无关

查询这个很简单。现在需要查询额外数据的事件。此事件表示上传图像的用户:

事件: IMAGEUPLOAD
user_id: 19(用户表的外键)
日期:当前日期
image_id: 12

第二个事件需要连接到图像表以从该表中获取图像URL列。第三个事件可能是评论投票,我需要在评论表中加入以获得额外的列。

本质上,我需要一种方法来根据事件类型有条件地选择每行的额外列(而不是行)。当列来自同一个表时,这很容易做到,但我正在努力使用来自其他表的连接来完成此操作。我希望在不使用存储过程的情况下在一个条件查询中执行此操作。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使连接取决于事件类型,例如:

 select     *
 from       Events e
 left join  Image i
 on         e.event = 'IMAGEUPLOAD'
 and        e.image_id = i.id
 left join  comments c
 on         e.event = 'COMMENT'
 and        e.comment_id = c.id

如果在所有链接表中共享一列,例如create_date,您可以coalesce选择不是NULL的列:

select      coalesce(i.create_date, c.create_date, ...) as create_date

答案 1 :(得分:0)

无法准确地完成您想要做的事情。 SELECT用于返回元组/行的列表,每个元素/列的元素/列数相同。

你在这里真正要做的是收集2种不同类型的信息,无论如何你将不得不分别处理2种不同的信息,这应该暗示你做了一些稍微错误的事情。相反,单独拉出各种事件类型,执行您需要执行的任何其他操作以将它们转换为您的公共输出类型(例如,HTML,如果这是针对网站),然后在该阶段将它们交错。