我有一个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回答表?有关此决定的任何意见,以及对查询的任何想法?
答案 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