2011-10-18 5 views
0

私の問題は、説明するのは少し難しい例により、最も簡単:MySQLでMySQLは文字列値位置-バイスに参加

私は2つのテーブル、アンケートからたstatmentsで1と答え1、このようなものを持っている:

まずテーブル:

tblstm 
StmNo, Statement, LanguageISO3 

なステートメントはLanguageISO3で策定質問、すなわち(1、 "質問1"、 "ENU")、(2、 "質問2"、 "ENU")です、等...

2番目の表は:

tblanswer 
RespondentId, Answer 

回答はすなわち、yesまたはnoのために0または1の文字列です。例えば、 "01010110110111"の場合、ビットの位置はtblstm内のStmNoに対応する。

既知のレスポンスIDについては、対応する回答を含む別々の行(tblstmテーブルなど)に各ステートメントを取得するためにクエリを作成するにはどうすればよいですか。

1, Question 1, 0 
2, Question 2, 1 
3, Question 3, 0 
etc 
+0

どのように多くの答えは文字列 'Answer'の長さ/ビット数/数です – Yahia

+4

可能であれば、この悪夢から身を守り、答えを適切な外部キーを持つ正規化されたデータ構造に再構成します。 –

+0

@Yahiaその48文字の長さ – Muleskinner

答えて

2

としてすでに上記のコメントで助言本当に正規化された構造にそれを再設計する必要があります。結果は次のようなものでなければなりません!

次はお勧めしません:あなたは本当にあなたの現在のデータモデルでこれを行いたい場合

あなたはそれが同様に行うことができ、以下の(私はMySQLの専門家はので、おそらくありませんしています注意してくださいより良い方法):!上記

SELECT s.StmNo, s.Statement, SUBSTR (a.Answer, s.StmNo, 1) 
FROM tblstm s CROSS JOIN tblanswer a WHERE a.RespondentId = 22 AND s.StmNo = 1 
UNION 
SELECT s.StmNo, s.Statement, SUBSTR (a.Answer, s.StmNo, 1) 
FROM tblstm s CROSS JOIN tblanswer a WHERE a.RespondentId = 22 AND s.StmNo = 2 
UNION 
SELECT s.StmNo, s.Statement, SUBSTR (a.Answer, s.StmNo, 1) 
FROM tblstm s CROSS JOIN tblanswer a WHERE a.RespondentId = 22 AND s.StmNo = 3 

はそれが... StmNoAnswerにおけるそれぞれの答えのインデックスと同一であることを前提として、あなたの最初の3つの質問についての回答を提供します(私はMySQLを使ったことがない)効率的にもエレガントとMySQLでこれを行うために、よりエレガントな方法があるかもしれませ...

EDIT - 別のオプション:

と1列AnswerNoとテーブルtableAnswerNoを作成します。 48行...行には[1; 48]からのそれぞれ異なる番号が含まれています。

次にあなたがこれを行うことができます:

SELECT s.StmNo, s.Statement, x.Answer FROM 
tblstm s CROSS JOIN 
(SELECT a.RespondentId, an.AnswerNo, SUBSTR (a.Answer, an.AnswerNo, 1) Answer FROM 
tblanswer a CROSS JOIN tableAnswerNo an WHERE a.RespondentId = 22) x ON x.AnswerNo = s.StmNo 
ORDER BY s.StmNo 

これはあなたのRespondentId 22のためのすべての48点の答えにあなたが望むようになりますが...このような

+0

ありがとうございます - これを試してみます – Muleskinner

+0

@ ThomasC.Thomsen私の編集を参照してください...そして助けの答えが受け入れられたとしてupvote /マークを忘れないでください... – Yahia

1

何か:

SELECT 
    s.StmNo 
    , s.Statement 
    , SUBSTRING(a.Answer, s.StmNo, 1) 
FROM 
    tblstm s 
    JOIN 
    tblanswer a 
     ON a.QType = s.QType 
WHERE 
    a.RespondentId = @KnownRespondentId 
ORDER BY 
    s.StmNo 
+0

非常に良い!それを解決するようだ – Muleskinner

関連する問題