0

我有 2 张桌子:问题和测验。

测验是问题的集合。

测验表如下所示:

测验ID | QuestionIds (NVARCHAR50)

  1    | 1,2,3,4,5
  2    | 6,7,8,9

Question 表的结构不相关。它的主键是 ID(整数)

对于给定的问题 ID,我想选择所有问题数据

此 SQL 不起作用(给出语法错误)

SELECT qs.* FROM Questions AS qs
INNER JOIN Quiz AS qz on qs.ID IN (qz.QuestionIds)
WHERE qz.QuizId = 2;

SQL 错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'qz.QuestionIds where qz.QuizId = 2 附近使用的正确语法

下面的 SQL 没有给出预期的结果。它只给出 1 个 ID 为 6 的问题。我猜原因是 QuestionIds(在 Quiz 表中)是 nvarchar 字段,而 ID(在问题表中)是整数。

SELECT * FROM Questions WHERE ID IN (SELECT QuestionIds FROM Quiz WHERE QuizId = 2)

我该怎么办 ?

我想通过 SQL/过程/例程提取它。

4

1 回答 1

5

你可以FIND_IN_SET()用来连接你的两张桌子,

SELECT  qs.*
FROM    Questions qs
        INNER JOIN Quiz qz
            ON FIND_IN_SET(qs.ID, qz.QuestionIDs) > 0
WHERE   qz.QuizID = 2

但我建议的方法是将您的表格规范化为 3 表格设计。

问题表

  • 问题 ID (PK)
  • 问题文本
  • 其他栏目...

测验表

  • 测验ID(PK)
  • 其他栏目...

Quiz_Question 表

  • QuestionID (FK) -- QuizID 的主键
  • 测验ID (FK)

..如果您使用的是 3 表设计,查询将如下所示:

SELECT  qs.*
FROM    Questions qs
        INNER JOIN Quiz_Questions qq
            ON qq.QuestionID=qs.ID
WHERE   qq.QuizID = 2
于 2013-08-17T19:55:59.067 回答