是否有算法将数字组合转换为一个数字?

时间:2013-04-21 16:08:22

标签: mysql algorithm combinations

我正在开发一个类似调查的应用程序。对于多项选择题,我想将一个项目组合存储在一个数字中以将其存储在一行中。

所以问题的数据库结构是这样的:

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*
  • x应该是一个数字,表示它是从数字42,43,46
  • 派生的

所以在数学上它会像

f({42,43,46}) = x   and   f^-1(x)={42,43,46}

解决此问题的一种方法可能是使用素数作为项目ID。因此它们的乘法是唯一的,但有没有办法用所有数字做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:1)

不,不,不。这不是您想要在关系数据库中执行的操作。

questions的原始表格更接近正确的方法。

如果您想获得所有可能的答案,请执行以下查询:

select id, type, text, group_concat(item_id)
from questions q
group by id, type, text;

但是,你应该拥有的是两张桌子(至少)。列出每个问题的问题,并包含以下列:

  • question_id
  • 文本

每个问题使用 1 行(即question_id是主键)。

第二个表格question_items,其中包含以下列:

  • question_items_id
  • question_id
  • 有关该项目的更多信息

使用此格式,上述查询更像是:

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)

这不是解决此问题的最佳方式。你应该有一个多表结构,即

  • 问题 =每个问题1行,包含文字和问题类型
  • 项目 =每个项目一行
  • QuestionHasItems =每个项目每个问题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;