gpt4 book ai didi

mysql - 将事件表与 MYSQL 中的源表连接

转载 作者:行者123 更新时间:2023-11-29 08:45:22 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com