2014-02-13 3 views
0

У меня есть следующие таблицы.Объединить строки в MySQL

CREATE TABLE `cms_compound` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `nomenclature` varchar(50) DEFAULT NULL, 
    `version_number` bigint(20) DEFAULT NULL, 
    `version_region_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `cms_compound_disease` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `compound_id` bigint(20) NOT NULL, 
    `disease_id` bigint(20) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `cms_disease` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title` varchar(50) DEFAULT NULL, 
    `acronym` varchar(50) DEFAULT NULL, 
    `version_number` bigint(20) DEFAULT NULL, 
    `version_region_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `cms_version_region` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `version_id` bigint(20) NOT NULL, 
    `region_id` bigint(20) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

И я использую следующий запрос,

SELECT SQL_CALC_FOUND_ROWS 
    c.id, 
    c.nomenclature, 
    d.acronym 
FROM 
    compound c 
LEFT JOIN 
    compound_disease cd ON (cd.compound_id = c.id) 
LEFT JOIN 
    disease d ON (cd.disease_id = d.id) 
LEFT JOIN 
    version_region vr ON (vr.id = c.version_region_id) 
WHERE 
    c.version_number = 2 AND vr.version_id = 2 AND vr.region_id = 1 
LIMIT 0, 10 

это дает мне следующий результат.

+-----+--------------+---------+ 
| id | nomenclature | acronym | 
+-----+--------------+---------+ 
| 155 | AEB071  | ALL  | 
| 155 | AEB071  | AML  | 
| 155 | AEB071  | AdCC | 
| 156 | Nilotinib | NULL | 
| 161 | Buparlisib | NULL | 
| 162 | BYL719  | NULL | 
+-----+--------------+---------+ 

Обратите внимание, что идентификатор 155 для номенклатуры AEB071 повторяются после LEFT JOIN.

Я хочу, чтобы следующий результат (аббревиатура конкатенации)

+-----+--------------+--------------------+ 
| id | nomenclature | acronym   | 
+-----+--------------+--------------------+ 
| 155 | AEB071  | ALL, AML, AdCC  | 
| 156 | Nilotinib | NULL    | 
| 161 | Buparlisib | NULL    | 
| 162 | BYL719  | NULL    | 
+-----+--------------+--------------------+ 

Как я могу это сделать с помощью запроса MySQL?

+0

[ 'GROUP_CONCAT()'] (https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) является активным ингредиентом для получения результата, который вы ищете. –

+0

Мое предпочтение заключается в том, чтобы обрабатывать подобные вещи в коде уровня приложения. – Strawberry

ответ

2

Применение GROUP_CONCAT():

SELECT SQL_CALC_FOUND_ROWS 
    c.id, 
    c.nomenclature, 
    GROUP_CONCAT(d.acronym) 
FROM 
    compound c 
LEFT JOIN 
    compound_disease cd ON (cd.compound_id = c.id) 
LEFT JOIN 
    disease d ON (cd.disease_id = d.id) 
LEFT JOIN 
    version_region vr ON (vr.id = c.version_region_id) 
WHERE 
    c.version_number = 2 AND vr.version_id = 2 AND vr.region_id = 1 
GROUP BY 
    c.id, 
    c.nomenclature 
+0

Спасибо, это работает :) –

+0

Это дает мне вопрос, когда я хочу реализовать LIKE для этой записи. –

+0

LIKE для записи? Какой вопрос? –

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