我正在开发一个类似调查的应用程序。对于多项选择题,我想将一个项目组合存储在一个数字中以将其存储在一行中。
所以问题的数据库结构是这样的:
id type text item_id
-- --------------- --------------------------- -------
1 multiple_choice which one would you choose? 42
1 multiple_choice which one would you choose? 43
1 multiple_choice which one would you choose? 46
这是一个有3个选项的问题,选项将从另一个表项目调用,id为42,43,46
所以我想把这个组合变成一个数字来实现这个目标:
id type text items
-- --------------- --------------------------- -------
1 multiple_choice which one would you choose? x*
所以在数学上它会像
f({42,43,46}) = x and f^-1(x)={42,43,46}
解决此问题的一种方法可能是使用素数作为项目ID。因此它们的乘法是唯一的,但有没有办法用所有数字做到这一点?
提前致谢。
答案 0 :(得分:1)
不,不,不。这不是您想要在关系数据库中执行的操作。
questions
的原始表格更接近正确的方法。
如果您想获得所有可能的答案,请执行以下查询:
select id, type, text, group_concat(item_id)
from questions q
group by id, type, text;
但是,你应该拥有的是两张桌子(至少)。列出每个问题的问题,并包含以下列:
每个问题使用 1 行(即question_id
是主键)。
第二个表格question_items
,其中包含以下列:
使用此格式,上述查询更像是:
select q.question_id, q.type, q.text, group_concat(qi.question_item_id)
from questions q join
question_items qi
on q.question_id = qi.question_id
group by q.question_id, q.type, q.text;
虽然查询可能看起来有点复杂,但底层数据结构更能代表您的问题域。这使得整个系统更加强大和可维护。
答案 1 :(得分:1)
这不是解决此问题的最佳方式。你应该有一个多表结构,即
这些名称仅用于说明。通过沿着您开始的路线走下去,字段“type”,“id”和“text”是多余的,因此非常浪费/低效。
如果您查看此示例,则会看到预填充的表结构和示例查询。 http://sqlfiddle.com/#!2/fdf5f/4
以下查询将生成您希望的数据
SELECT
q.questionid,
q.questiontype,
q.questiontext,
GROUP_CONCAT(i.itemid) AS itemIDs,
GROUP_CONCAT(i.itemtext) AS itemTexts
FROM questions q
INNER JOIN questionHasItems qhi
ON qhi.questionid = q.questionid
INNER JOIN items i
ON i.itemid = qhi.itemid
GROUP BY q.questionid;
通过执行诸如
之类的查询,您可以有效地获取问题可用的选项SELECT
i.itemid AS itemIDs,
i.itemtext AS itemTexts
FROM questionHasItems qhi
INNER JOIN items i
ON i.itemid = qhi.itemid
WHERE qhi.questionid = 1;