我有两个mysql表health_status_questions和health_answers。 Helow是形象。
这里是haelth_answers表
最后,我需要通过组合两个表来检索如下所示的行。
答案 0 :(得分:0)
这应该有效
SELECT qs.id, qs.QstnShort, qs.QstnDetail,
q1.Q1, q2.Q2, q3.Q3, q4.Q4, q5.Q5, q6.Q6,
q7.Q7, q8.Q8, q9.Q9, q10.Q10, q11.Q11, q12.Q12,
q13.Q13, q14.Q14, q15.Q15, q16.Q16, q17.Q17,
q18.Q18, q19.Q19, q20.Q20
FROM health_status_questions qs, health_answers q1,
health_answers q2, health_answers q3, health_answers q4,
health_answers q5, health_answers q6, health_answers q7,
health_answers q8, health_answers q9, health_answers q10,
health_answers q11, health_answers q12, health_answers q13,
health_answers q14, health_answers q15, health_answers q16,
health_answers q17, health_answers q18, health_answers q19
health_answers q20
WHERE q1.id = 1 and q2.id = 1 and q3.id = 1 and q4.id
and q5.id = 1 and q6.id = 1 and q7.id = 1 and q8.id
and q9.id = 1 and q10.id = 1 and q11.id = 1 and q12.id
and q13.id = 1 and q14.id = 1 and q15.id = 1 and q16.id
and q17.id = 1 and q18.id = 1 and q19.id = 1 and q20.id
答案 1 :(得分:0)
每个答案都有一列是非常糟糕的设计,因为你无疑已经注意到了。很好地说明您的架构出了问题,您需要添加一列来添加问题。通过适当的设计,您只需执行INSERT。
无论如何,你想把这些列变成行,所以答案如下:
SELECT 1 AS qid, Q1 AS qv FROM health_answers WHERE id=1
UNION ALL
SELECT 2 AS qid, Q2 FROM health_answers WHERE id=1
UNION ALL
...yadda yadda...
UNION ALL
SELECT 20 AS qid, Q20 FROM health_answers WHERE id=1
这会将您的20列变为20行,每行的“qid”等于列的数量,“qv”等于列的内容。
接下来,您可以加入此项以获得所需的演示文稿:
SELECT q.*, qa.qv
FROM (huge SELECT with the unions above) qa
JOIN health_status_questions q ON (q.id=qa.qid)
但是,如果您仍然可以将其更改为每个问题和答案一行的链接表,请像(session_id,question_id,answer_id)那样尽快完成,您将节省在路上的头痛......
编辑:更好的架构
这很简单。你有一个问题表:
questions
question_id, question_text, ...
你可以添加一个“question_type”列来确定答案是否应该是数字(年龄,体重)或是/否,这样的东西。
现在记录每个会话的答案:
answers_sessions:
session_id, question_id, answer
当用户启动调查问卷时,他们将获得session_id。然后对于他们回答的每个问题,插入一行,其中包含问题的ID和答案。
如果所有问题都是是/否或数字,那么答案就是INT。如果所有问题都是多项选择,那么它将是表格答案中答案的ID。
因此,在用户回答了20个问题之后,你会在answers_sessions表中获得20行,并且要获得你想要的显示,你只需要将这个问题加入到问题中以获得问题文本。
添加新问题只需要插入问题表,这比修改代码和数据库结构简单得多。
注意:您需要一个单独的答案表,以获取需要多项选择答案的更详细的问题。
answers:
question_id (FK), answer_id (PK), answer_text, answer order maybe too
例如,一个问题“你最喜欢的颜色是什么”会在答案表中有“红色”“绿色”等等。在表格中有答案可以很容易地添加/删除/更新并加入它显示目的。但你的问题似乎都是肯定/否,所以你不需要这个。