mysql - 如何对 5 个表执行 JOIN 并获取我需要的数据?

标签 mysql sql

我有一个数据库,其中有 5 个表,分别代表调查及其问题、用户的响应以及一个邮件列表,用于保存有关我已发送的电子邮件的信息。

我为用户生成 guid,使其无法通过其他用户的调查(我的应用程序中没有身份验证)并将这些 guid 存储在邮件列表表和响应表中。

这是数据库架构:

DB

当前端通过 guid 请求调查以便用户可以回答时,我放置了一个简单的 SELECT 查询:

SELECT 
   se.survey_id, se.id, se.`type`, se.title
FROM 
  survey_element AS se 
    JOIN mailing_list AS ml  
      ON se.survey_id = ml.survey_id
WHERE ml.guid = '7658bc0f768bd5e0'
ORDER BY se.`order`

这让我很感动

survey_id  id  type           title
1          1   head_question  How do you feel?
1          5   idea           Do you have any ideas?

(另请参阅 https://www.db-fiddle.com/f/rktX4mjfxKLwGA1izbQFoV/2 )

一切正常,但现在我想选择问题的答案(如果有)。因此,相同的 guid、相同的问题(调查元素),我想获取对第一个问题回答“1”但未回答第二个问题的用户的输出:

survey_id  id  type           title                     answer
1          1   head_question  How do you feel?          1
1          5   idea           Do you have any ideas?    (NULL)

我尝试了不同的方法,但我要么得到多个具有相同标题的问题(因为多个用户回答了),要么得到用户尚未真正回答的问题的相同答案。

像这样(提供多个条目,请参阅 https://www.db-fiddle.com/f/2yQJ1q7jDzQMNWGBxNB6br/3 ):

SELECT 
  se.survey_id, se.id , se.`type`, se.title, re.answer
FROM 
  survey_element AS se 
    JOIN mailing_list AS ml 
      ON se.survey_id=ml.survey_id 
    LEFT OUTER JOIN response_element AS re
      ON re.survey_element_id = se.id
WHERE ml.guid = '7658bc0f768bd5e0'
ORDER BY se.`order`

所有数据都在那里,但我只是无法以正确的方式选择它:-\

关于如何做到这一点有什么想法吗?

数据库服务器是MySQL 5.7。

最佳答案

我认为您可能缺少 responseresponse_element 之间的 JOIN?它没有显示在您的数据模型中,但我认为它的工作方式与 survey_elementsurvey 的工作原理相同?如果它确实以这种方式工作,那么这个查询似乎可以工作:

SELECT 
    se.survey_id, 
    se.id, 
    se.`type`, 
    se.title, 
    re.answer
FROM 
    survey_element AS se 
    INNER JOIN mailing_list AS ml ON se.survey_id = ml.survey_id
    INNER JOIN response r ON r.guid = ml.guid
    LEFT JOIN response_element AS re ON re.survey_element_id = se.id 
        AND re.response_id = r.id
WHERE 
    ml.guid = '7658bc0f768bd5e0'
ORDER BY 
    se.`order`

这为您提供了 Joe 的问题和答复列表,其中有 NULL,因为他没有回答第二个问题。

survey_id   id    type            title                    answer
1           1     head_question   How do you feel?         1  
1           5     idea            Do you have any ideas?   null

实际上,重新阅读你的问题我可以看到 response_element 中的 response_id 有一个 (FK) 后缀,这让我更加确定这只是您的架构/数据模型中的遗漏?

关于mysql - 如何对 5 个表执行 JOIN 并获取我需要的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49192648/

相关文章:

MYSQL - 三重内部连接和 SUM

mysql - 了解 MySQL 中的排名功能

mysql - 选择DML还是DDL?

mysql - DATE_SUB 以特定格式返回日期

mysql - 如何将 OR 应用于 JOIN...ON 语句

mysql - SQL 多个表之间的多对多关系

mysql - MySQL 中何时使用单引号、双引号和反引号

php mysql select 好像不工作

php - 哈希密码 php

mysql - 关于mysql显示进程列表