2012-03-12 2 views
0

Следуя this article, я смог частично перенести таблицу mySQL. Это таблица:Проблемы с PIVOT с использованием GROUP_CONCAT

CREATE TABLE `test`.`treat` (
`patient` INT NOT NULL , 
`pathology` VARCHAR(15) NOT NULL , 
`present` VARCHAR(15) NOT NULL 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

затем вставить некоторые данные:

INSERT INTO `test`.`treat` (`patient`, `pathology`, `present`) 
VALUES ('1', 'myeloid', 'yes'), ('2', 'lymphoid', 'yes'), ('2', 'myeloid', 'no'), ('3', 'myeloid', 'no'), ('4', 'lymphoid', 'yes'); 

и теперь мне нужно, чтобы получить то, что patients страдают от lymphoid или myeloid патологии:

SELECT patient, 
    GROUP_CONCAT(if(pathology='myeloid', present, NULL)) AS 'myeloid', 
    GROUP_CONCAT(if(pathology='lymphoid', present, NULL)) AS 'lymphoid' 
FROM treat 
GROUP BY patient 

Я получаю таблица, подобная этой, которая показывает, когда пациент перенес одну из этих патологий или NULL, если нет информации:

patient myeloid lymphoid 
1  yes  NULL 
2  no  yes 
3  no  NULL 
4  NULL  yes 

Эти данные соответствуют периодическим испытаниям. Для упрощения я использовал параметр test (test INT NOT NULL). Но проблема в том, что у меня есть две данные для одного и того же пациента. Например, давайте добавим test ключ и новый тест для пациента 2 (все предыдущие test значения соответствует тест 1):

INSERT INTO `test`.`treat` (`patient`, `pathology`, `present`, `test`) 
VALUES ('2', 'myeloid', 'yes', '2'); 

Если мы запустим запрос мы получаем эту таблицу:

patient myeloid lymphoid 
1  yes  NULL 
2  no,yes yes 
3  no  NULL 
4  NULL  yes 

Пациент номер 2 имеет строку myeloid, которая производится * GROUP_CONCAT * с двумя значениями, разделенными запятой. Мне нужно иметь строку для каждого значения, например:

patient myeloid lymphoid 
1  yes  NULL 
2  no  yes 
2  yes  NULL 
3  no  NULL 
4  NULL  yes 

Что нужно сделать, чтобы принять во внимание номер теста?

ответ

1

Просто добавьте тест вашей группировки -

SELECT 
    patient, 
    GROUP_CONCAT(IF(pathology='myeloid', present, NULL)) AS 'myeloid', 
    GROUP_CONCAT(IF(pathology='lymphoid', present, NULL)) AS 'lymphoid' 
FROM treat 
GROUP BY patient, test 
Смежные вопросы