Mysql объединить строковое значение position-Vice - PullRequest
0 голосов
/ 19 октября 2011

Моя проблема немного сложна для объяснения, проще всего на примере:

В MySQL у меня есть две таблицы, одна с оценками из вопросника и одна с ответами, что-то вроде этого:

Первая таблица:

tblstm
StmNo, Statement, LanguageISO3

Статуя - это сформулированный вопрос в LanguageISO3, т.е. (1, «Вопрос 1», «ЕНУ»), (2, «Вопрос 2», «ЕНУ») и т. Д. *

Вторая таблица:

tblanswer
RespondentId, Answer

Ответ является строкой с 0 или 1 для да или нет, т.е. «01010110110111», например, позиция бита соответствует StmNo в tblstm.

Как мне написать запрос, чтобы я получал каждое утверждение в отдельной строке (например, в таблице tblstm) с соответствующим ответом для известного RespondentId. Результат должен быть примерно таким:

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

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Как уже советовали в комментариях выше, вы должны действительно изменить это до нормализованной структуры!

НЕ рекомендуется:

Если вы действительно хотите сделать это с вашей текущей моделью данных, вы можете сделать это следующим образом (обратите внимание, я не эксперт по 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

Вышеприведенное предполагает, что StmNo идентично индексу соответствующего ответа в Answer и дает вам ответы на первые 3 вопроса ... это НЕ эффективно и не элегантно И может быть более элегантный способ чтобы сделать это с MySQL (я никогда не использовал MySQL) ...

РЕДАКТИРОВАТЬ - другой вариант:

Создать таблицу tableAnswerNo с одним столбцом AnswerNo с 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

Это дает вам все 48 ответов для RespondentId 22 так, как вы хотите ...

1 голос
/ 19 октября 2011

Примерно так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...