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

标签 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 对问题和答案表执行查询?对这个决定有什么意见,对质疑有什么想法吗?

最佳答案

您可以使用外连接,它会返回事件表中的所有内容,即使答案表中没有相应的行:

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/

相关文章:

php - SQL 数据库错误 : Cannot Prepare Statement

mysql - 将 sql master 链接到属性表,然后将 prop 值表示为列

c# - 使用 LINQ 在两个 Dictionary<int, string> 上进行 LEFT OUTER JOIN

mysql - 如何选择已订购 3 种不同产品但未订购第四种产品的客户?

php - MySQL - JOIN 操作多个表

Mysql 转换为单选查询

mysql - 将数据库列映射到 Excel 电子表格

php - Doctrine DBAL - SELECT 连接两个表,在结果的键中带有前缀

c# - 如何连接具有不同主键/外键的表

php - MySQL:连接两个表/如果表A中的特定字段不为空,则从表B中的特定行读取所有数据