2015-02-04 2 views
2

У меня есть таблица с двумя столбцами (случай и Подслучай) и следующие значения:пример GROUP_CONCAT

case subcase 
1 0 
2 1 
3 1 
4 0 
5 0 
6 4 

Я хочу иметь список дел только имеющих подслучай (ы) как:

case list_of_subcase 
1  2,3 
4  6 
5  0 

Случаи 2,3 и 6 не указаны, поскольку они являются подслучаями.

Корпус 5 не имеет подсекций, но сам не является подзаголовком.

Как написать правильный выбор? Любая помощь?

+0

Обратите внимание, что NULL обычно используется для идентификации сирот - и CASE является зарезервированным словом. – Strawberry

ответ

1

мы в опасности overthinking это ...

DROP TABLE my_table; 

CREATE TABLE my_table 
(my_case INT NOT NULL 
,subcase INT NULL 
); 

INSERT INTO my_table VALUES 
(1 ,NULL), 
(2 ,1), 
(3 ,1), 
(4 ,NULL), 
(5 ,NULL), 
(6 ,4); 

SELECT x.my_case 
    , GROUP_CONCAT(y.my_case) subcases 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.subcase = x.my_case 
WHERE x.subcase IS NULL 
GROUP 
    BY x.my_case; 
+---------+----------+ 
| my_case | subcases | 
+---------+----------+ 
|  1 | 2,3  | 
|  4 | 6  | 
|  5 | NULL  | 
+---------+----------+ 
+0

Работает как очарование. Это то, чего я хочу достичь. – Piotr0101

0

Задача здесь - получить правильную фильтрацию - сохранить «5», но не другие подслучаи.

select (case when c.subcase = 0 then c.case else c.subcase) as subcase, 
     group_concat(c.case) 
from cases c 
where c.subcase = 0 or 
     (c.subcase = 0 and 
     not exists (select 1 from cases c2 where c2.subcase = c.case) 
    ) 
group by (case when c.subcase = 0 then c.case else c.subcase end); 

EDIT:

Это может быть проще, просто фраза это с помощью union all:

select c.subcase, group_concat(c.case) 
from cases c 
where c.subcase = 0 
group by c.subcase 
union all 
select c.case, 0 
from cases c 
group by c.case 
having sum(c.subcase <> 0) = 0; 
+0

(в случае необходимости) – Strawberry

+0

@Strawberry. , , Они всегда это делают. Спасибо. –

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