0

我有一个 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?对这个决定有什么意见,对查询有什么想法?

4

1 回答 1

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
于 2012-09-29T17:24:52.500 回答