Сравнение строк в таблице PostgreSQL
Есть таблица в PostgreSQL такого типа:
create table symptoms (
sickId serial primary key,
"Наименование" varchar(40),
"Общее недомогание" boolean default false,
"Сухость, першение" boolean default false,
"Кашель сначала сухой, затем мокрый" boolean default false,
"Голос хриплый или беззвучный" boolean default false,
"Иногда боль при глотании" boolean default false,
"Головная боль" boolean default false,
"Повышеная температура тела" boolean default false,
"Быстрая утомляемость гортани" boolean default false,
"Переодический кашель с мокротой" boolean default false,
"Охриплость с афонией" boolean default false,
"Ощущение дискомфорта в гортани" boolean default false,
"Жжение в горле" boolean default false,
"Кашель при обострении" boolean default false,
"Сухой кашель" boolean default false,
"Слизистая покрыта густой слизью" boolean default false,
"Откашливание с прожилками крови" boolean default false);
Получается что-то вроде этого:
Нужно сравнить заболевание, которое ввел пользователь со строками в таблице, если заболевание пользователя по СИМПТОМАМ входит состав(то есть имеет полное совпадение по симптомам) в любое заболевание из таблицы. Так же нужно сравнить входит ли в состав по симптомам любое заболевание из таблицы в заболевание которое ввел пользователь. Пояснение: Пользователь ввел заболевание с любым именем и поставил значение true в колонки "Общее недомогание" и "Сухость, першение". Его заболевание входит в состав Ларингит острый, ларингит хронический катаральный, ларингит хронический атрофический. Необходимо вычислить эти совпадения. Подскажите как можно реализовать данную процедуру?
Ответы (2 шт):
@Akina Исходные данные таблицы, Таблица с симптомами:
create table symptoms (
sickId serial primary key,
"Наименование" varchar(40),
"Общее недомогание" boolean default false,
"Сухость, першение" boolean default false,
"Кашель сначала сухой, затем мокрый" boolean default false,
"Голос хриплый или беззвучный" boolean default false,
"Иногда боль при глотании" boolean default false,
"Головная боль" boolean default false,
"Повышеная температура тела" boolean default false,
"Быстрая утомляемость гортани" boolean default false,
"Переодический кашель с мокротой" boolean default false,
"Охриплость с афонией" boolean default false,
"Ощущение дискомфорта в гортани" boolean default false,
"Жжение в горле" boolean default false,
"Кашель при обострении" boolean default false,
"Сухой кашель" boolean default false,
"Слизистая покрыта густой слизью" boolean default false,
"Откашливание с прожилками крови" boolean default false);
insert into symptoms ("Наименование", "Общее недомогание", "Сухость, першение", "Кашель сначала сухой, затем мокрый", "Голос хриплый или беззвучный", "Иногда боль при глотании", "Головная боль", "Повышеная температура тела", "Быстрая утомляемость гортани", "Переодический кашель с мокротой", "Охриплость с афонией", "Ощущение дискомфорта в гортани", "Жжение в горле", "Кашель при обострении", "Сухой кашель", "Слизистая покрыта густой слизью", "Откашливание с прожилками крови")
values ('Ларингит острый',true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false),
('Ларингит хронический катаральный',true,true,false,true,false,false,false,true,true,false,false,false,false,false,false,false),
('Ларингит хронический гипертрофический',true,false,false,false,false,false,false,false,false,true,true,true,true,false,false,false),
('Ларингит хронический атрофический',true,true,false,true,false,false,false,false,false,false,false,false,false,true,true,true);
Вторая таблица, данные пациента:
create table patient(
sickId serial primary key,
"Наименование" varchar(40),
"Общее недомогание" boolean default false,
"Сухость, першение" boolean default false,
"Кашель сначала сухой, затем мокрый" boolean default false,
"Голос хриплый или беззвучный" boolean default false,
"Иногда боль при глотании" boolean default false,
"Головная боль" boolean default false,
"Повышеная температура тела" boolean default false,
"Быстрая утомляемость гортани" boolean default false,
"Переодический кашель с мокротой" boolean default false,
"Охриплость с афонией" boolean default false,
"Ощущение дискомфорта в гортани" boolean default false,
"Жжение в горле" boolean default false,
"Кашель при обострении" boolean default false,
"Сухой кашель" boolean default false,
"Слизистая покрыта густой слизью" boolean default false,
"Откашливание с прожилками крови" boolean default false);
insert into patient ("Наименование", "Общее недомогание", "Сухость, першение", "Кашель сначала сухой, затем мокрый", "Голос хриплый или беззвучный", "Иногда боль при глотании", "Головная боль", "Повышеная температура тела", "Быстрая утомляемость гортани", "Переодический кашель с мокротой", "Охриплость с афонией", "Ощущение дискомфорта в гортани", "Жжение в горле", "Кашель при обострении", "Сухой кашель", "Слизистая покрыта густой слизью", "Откашливание с прожилками крови")
values ('Простуда',true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false);
Заболевание простуда входит в состав всех заболеваний изначальной таблицы(symptoms). Мне нужно найти это совпадение. И в обратном порядке тоже. То есть когда заболевание из таблицы симптомов совпадает по своим симптомам с заболеванием пациента.
По делу... не уверен в правильности понимания проблемы. вероятно такая идея даст путь к решению проблемы. нужно вписать все симптомы, сейчас их 3.
select count(*) n, concat(p1."Наименование"), concat(s1."Наименование") co
from symptoms s1
left join patient p1 on s1."Общее недомогание" = p1."Общее недомогание"
where p1 is not null group by p1."Наименование", s1."Наименование"
union
select count() n, concat(p2."Наименование") co, concat(s2."Наименование")
from symptoms s2 left
join patient p2 on s2."Сухость, першение" = p2."Сухость, першение"
where p2 is not null group by p2."Наименование", s2."Наименование"
union
select count() n, concat(p3."Наименование") co, concat(s3."Наименование")
from symptoms s3 left join patient p3 on s3."Головная боль" = p3."Головная боль"
where p3 is not null
group by p3."Наименование", s3."Наименование"
order by n
Да, ну конечно первая мысль это явная необходимость иного построения базы данных. При том, что вы показали разработка будет всегда затягиваться раз в 10 не меньше. Это не преувеличение. Две эти таблицы это целая куча таблиц при правильном построении или хотя бы немного правильном. Тут основная проблема дать совет это в том, что обычно мы имеем дело с нормализованными базами данных... Вы же видите, что как минимум поля должны быть записями в структуре таблиц, в которых таких вопросов у вас не возникло бы.
