我有一个数据库,其中有 5 个表,分别代表调查及其问题、用户的响应以及一个邮件列表,用于保存有关我已发送的电子邮件的信息。
我为用户生成 guid,使其无法通过其他用户的调查(我的应用程序中没有身份验证)并将这些 guid 存储在邮件列表表和响应表中。
这是数据库架构:
当前端通过 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。
最佳答案
我认为您可能缺少 response
和 response_element
之间的 JOIN
?它没有显示在您的数据模型中,但我认为它的工作方式与 survey_element
到 survey
的工作原理相同?如果它确实以这种方式工作,那么这个查询似乎可以工作:
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/