我有一个 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 对问题和答案表执行查询?对这个决定有什么意见,对质疑有什么想法吗?
最佳答案
您可以使用外连接,它会返回事件表中的所有内容,即使答案表中没有相应的行:
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
关于mysql - 将事件表与 MYSQL 中的源表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654326/