0

質問とクイズの 2 つのテーブルがあります。

クイズは質問のコレクションです。

クイズの表は次のようになります。

QuizdId | QuestionId (NVARCHAR50)

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

質問テーブルの構造は関係ありません。その主キーは 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 構文にエラーがあります。'qz.QuestionIds where qz.QuizId = 2 の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

以下の SQL では、期待した結果が得られません。ID 6 の質問は 1 つだけです。その理由は、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()2 つのテーブルを結合するために使用できます。

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)
  • 他の列...

クイズ_質問表

  • 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 に答える