Mysql Неизвестный столбец, в котором предложение объединяет все - PullRequest
0 голосов
/ 07 марта 2020

Все еще связано с моим Предыдущим вопросом , есть таблица (tb_data), которая похожа на это

+---------+---------------------+---------------------+---------------------+---------------------+-------+ 
| Disease | Additional_Disease1 | Additional_Disease2 | Additional_Disease3 | Additional_Disease4 | Room  |
+---------+---------------------+---------------------+---------------------+---------------------+-------+
| A01     | A03                 | A02                 |                     |                     | Man   |
| A03     | A02                 |                     |                     |                     | Woman |
| A03     | A05                 |                     |                     |                     | Child |
| A03     | A05                 |                     |                     |                     | Man   |
| A02     | A05                 | A01                 | A03                 |                     | UGD   |
+---------+---------------------+---------------------+---------------------+---------------------+-------+ 

Мой вопрос заключается в том, как сделать это так

+---------+-------+ 
| Disease | Total |
+---------+-------+
| A03     | 2     |
| A02     | 1     |
| A01     | 1     |
| A05     | 1     |
+---------+-------+

Вот моя попытка кода

    select Disease, count(*) total
    from (
    select Disease from tb_data
    union all select Additional_Disease1 from tb_data
    union all select Additional_Disease2 from tb_data
    union all select Additional_Disease3 from tb_data
    union all select Additional_Disease4 from tb_data
) t
where Disease is not Null
and Room = 'Man'
group by Disease
order by total desc, Disease

Что приводит к ошибке

Error Code: 1054. Unknown column 'Room' in 'where clause'

Ответы [ 2 ]

3 голосов
/ 07 марта 2020

Ваша проблема в том, что ваша производная таблица не содержит столбец Room. Вы можете отфильтровать по Room в производной таблице:

select Disease, count(*) total
from (
    select Disease from tb_data where Room = 'Man'
    union all select Additional_Disease1 from tb_data where Room = 'Man'
    union all select Additional_Disease2 from tb_data where Room = 'Man'
    union all select Additional_Disease3 from tb_data where Room = 'Man'
    union all select Additional_Disease4 from tb_data where Room = 'Man'
) t
where Disease is not Null
group by Disease
order by total desc, Disease

или включить столбец Room в производной таблице:

select Disease, count(*) total
from (
    select Room, Disease from tb_data
    union all select Room, Additional_Disease1 from tb_data
    union all select Room, Additional_Disease2 from tb_data
    union all select Room, Additional_Disease3 from tb_data
    union all select Room, Additional_Disease4 from tb_data
) t
where Disease is not Null
and Room = 'Man'
group by Disease
order by total desc, Disease
0 голосов
/ 07 марта 2020

Если tb_data велико или генерируется подзапросом, то я не рекомендую подход union all для его отмены. Вместо:

select (case n.n
           when 1 then Disease
           when 2 then Additional_Disease1
           when 3 then Additional_Disease2
           when 4 then Additional_Disease3
           when 5 then Additional_Disease4
        end) as the_disease, count(*)
from tb_data d cross join
     (select 1 as n union all
      select 2 as n union all
      select 3 as n union all
      select 4 as n union all
      select 5 as n
     ) n
where Room = 'Man'
group by the_disease
having the_disease is not null
...