2012-08-29 5 views
0

Я попытался обойти это. Но я думаю, что меня нет.Условное изменение таблицы в MySQL Query

У меня есть 3 таблицы:

Этот рассказ содержит все вопросы и типы вопросов:

Table: Ref 
    id | type | info 
    ========================== 
    1   SS   Education 
    --------------------------- 
    2   RB   Gender 
    --------------------------- 
    3   ST   State 

Эта таблица содержит "варианты" для вопросов в приведенной выше таблице «Ref`

Table: ref_ans 
    id | q_id | answer_text 
    =========================== 
    1   1  Masters  
    --------------------------- 
    2   1  Bachelors  
    --------------------------- 
    3   1  Undergrad 
    --------------------------- 
    4   2  Male  
    --------------------------- 
    5   2  Female 
    --------------------------- 
    6   2  Dont want to disclose 

В этой таблице содержатся состояния (type = "ST" в таблице Ref)

Table: us_states 

    id | answer_text 
    =========================== 
    1  Alaska  
    --------------------------- 
    2  Alabama  
    --------------------------- 
    3  Arkansan 
    --------------------------- 
    4  Arizona  
    --------------------------- 
    5  Baltimore 
    --------------------------- 
    etc 

Результат я хочу это:

ref.id, ref_ans.id, ref.answer_text/us_states.answer_text 

* для данного ref.question_id *.

И условие: Если question_id, для которого запрошены ответы, является «ST», он должен вытащить ответы от us_states, в противном случае он должен вытащить из таблицы ref-ans.

Я пробовал это. Очевидно, что это не сработало:

SELECT ref.id, 
     CASE WHEN ref.type = 'ST' THEN 
      (SELECT ID, answer_text FROM us_states) 
     ELSE 
      (SELECT id, answer_text FROM ref_ans) 
    END 

    FROM ref 
    WHERE ref.ID = <id> 

Любые идеи?

+2

как 'us_states.id' связаны с другими таблицами? Я имею в виду, что 'us_states.id' то же самое, что' Ref.id'? –

+0

№ Нет ссылки на ref.id в us_states –

ответ

1

Try:

SELECT a.id, 
      COALESCE(b.id, c.id) AS ans_id, 
      COALESCE(b.answer_text, c.answer_text) AS answer_text 
FROM  ref a 
LEFT JOIN ref_ans b ON a.id = b.q_id 
LEFT JOIN us_states c ON a.type = 'ST' 
WHERE  a.id = <id> AND (
       (a.type <> 'ST' AND b.id IS NOT NULL) OR 
       (a.type = 'ST' AND c.id IS NOT NULL) 
     ) 
+0

Я должен дать вам +100 :-). Был небольшой сбой. Он показывает запись с нулевыми значениями, даже если на B для конкретного идентификатора вопроса нет записей. Поэтому я добавил «не null» при первом соединении, и теперь все работает. Большое спасибо! –

+0

@KevinRave, меня беспокоит ваше редактирование. Вы *** НЕОБХОДИМО *** первое соединение должно быть «NULL» в том случае, если вопрос является вопросом «ST», чтобы COALESCE мог использовать значение «NULL» для перехода к ответам в таблице «us_states» , Я думаю, что вы хотите отфильтровать, это вопросы, которые вообще не имеют ответов. Я пересмотрю свое решение, чтобы учесть это. –

+0

Да, я просто не хочу null для несуществующих ответов. Но не уверен, когда я пытался с NOT NULL в соединении, он, похоже, работает. Тем не менее, я попробую изменить. –

0

Если предположить, что все три таблицы связаны по идентификатору (первый столбец):

SELECT ref_ans.id, ref.id, if(ref.type='ST', us_states.answer_text, ref_ans.answer_text) as answer_text 
    FROM ref_ans 
    JOIN ref on ref.id=ref_ans.id 
    JOIN us_states on ref.id=us_states.id 
    WHERE ref_ans.q_id = <id> 
+0

Не все столбцы, которые я хочу, верны в вашем ответе. –

Смежные вопросы