将活动表与MYSQL中的源表连接

时间:2012-09-29 16:20:26

标签: mysql join

我有一个MYSQL'活动'表,其中记录了用户的所有活动。假设用户的活动可以是提问或回答问题。因此,如果用户提出问题,他们的问题会被放入“问题”表中,并且活动也会被放入“活动”表中。如果用户提供答案,同样的事情,除了答案进入'答案'表和'活动'表。

问题表的字段是:

q_id          question

答案表的字段是:

a_id          q_id        answer

活动表的字段为:

activity_id   q_id    user_id     action_type

(上面显示了更多列,但这些说明了这一点。)

我希望能够做的是显示用户最近在网站上的操作,并实际显示操作的内容。

我当前的MYSQL查询只是将活动表与问题表连接如下(使用PDO):

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc"  

这没关系,并且可以随时向我提供在活动列表中显示的问题。但是,如果返回的活动是答案,我希望能够显示答案。我尝试使用三连接,如下所示:

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id
LEFT JOIN answers ON activity.q_id = answers.q_id  
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc"

但是这只是给我一个行列表,它是第一个查询的两倍,并且当action_type是答案时不会显示答案。

我认为这应该是可能的,但我想的越多,我相信也许我应该废弃活动表并直接在问题上执行查询并使用UNION回答表?有关此决定的任何意见,以及对查询的任何想法?

1 个答案:

答案 0 :(得分:2)

您可以使用外部联接,即使答案表中没有相应的行,也会返回活动表中的所有内容:

SELECT *
FROM activity
LEFT JOIN question ON activity.q_id = question.q_id
LEFT OUTER JOIN answers ON activity.q_id = answers.q_id
WHERE activity.user_id = :user_id
ORDER BY activity.a_id desc

我假设对于活动表中的每个q_id值,问题表中总会有一个对应的行。

要解决重复答案的问题,我会在活动表中添加a_id字段。对于问题活动,您将其设置为NULL,并且对于每个答案,您将a_id字段设置为适当的a_id值,以确定哪个答案与活动一致。然后,您可以按如下方式调整上面的SQL:

SELECT *
FROM activity
LEFT JOIN question ON 
    activity.q_id = question.q_id
LEFT OUTER JOIN answers ON 
    activity.q_id = answers.q_id AND 
    activity.a_id = answers.a_id
WHERE activity.user_id = :user_id
ORDER BY activity.a_id desc