По заданному имени строки (m) найдите имена столбцов (n), когда (m, n) = x в базе данных MySQL как часть запроса PHP - PullRequest
2 голосов
/ 07 июня 2019

Я создаю веб-сайт для диагностики неврологических заболеваний.Он закодирован в html и связывается с базой данных MySQL через PHP.Основная таблица, которая передает информацию на веб-сайт, структурирована следующим образом: Изображение, показывающее структуру таблицы со строками, представляющими неврологические состояния, и столбцами, в которых представлена ​​информация о симптомах, связанных с этими состояниями

image

Таблицавыше можно воспроизвести, используя следующий код MySQL:


CREATE TABLE IF NOT EXISTS my_table (
    `Condition` VARCHAR(22) CHARACTER SET utf8,
    `Diarrhoea` INT,
    `Headache` INT,
    `Hyporeflexia` INT,
    `Hypoaesthesia_Spinothalamic` INT
);
INSERT INTO my_table VALUES
    ('Abetalipoproteinaemia',1,NULL,1,NULL),
    ('Caffeine toxicity',1,1,NULL,NULL),
    ('Vitamin B12 deficiency',NULL,NULL,1,2);

SELECT * FROM my_table;

Значения ячеек следующие:

  • (m, n) = 1, если условие иСимптомы связаны
  • (m, n) = 2, если состояние и симптом НЕ МОГУТ быть связаны.Наличие этого симптома исключает состояние как возможный диагноз.
  • (m, n) = ноль, если информация отсутствует или если симптом и состояние не связаны

Яизо всех сил пытается написать запрос SQL, который идентифицирует все столбцы (n) для определенного условия (m), где значение ячейки (m, n) = 2.

Пока мое чтение выдвинуло на первый план идеи осводные таблицы (я не понимаю, как бы я мог использовать их для этой проблемы) и нормализация базы данных, которая, по моему мнению, невозможна из-за других запросов, которые я выполняю для той же таблицы.

Пример, основанный на приведенной выше таблице:

  • Пациент с гипорефлексией
  • Запрос SQL определяет, что это может быть вызвано либо «абеталипопротеинемией», либо «дефицитом витамина B12» - все это прекрасно работаетуже
  • Я хочу установить, имеют ли какие-либо из выявленных состояний (абеталипопротеинемия и дефицит витамина В12) симптомы, исключающиеiagnosis (любая ячейка в этой строке = 2) и возвращает имя любого столбца (симптома), для которого это имеет место.
  • Запрос к базе данных SQL, идентифицирующий дефицит витамина B12, будет исключен как возможный диагнозесли присутствует гипоэстезия спиноталамуса - она ​​возвращается на html-дисплей.

Любая помощь будет принята с благодарностью - спасибо за ваше время!

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Я думаю, что было бы более обычным организовать данные примерно так - извинения за любые орфографические ошибки или плохую терминологию, но если вы заплатите арахису ...

syptom                 condition                   exclusion
Abetalipoproteinaemia  Diarrhoea                           0
Abetalipoproteinaemia  Hyporeflexia                        0
Caffeine toxicity      Diarrhoea                           0
Caffeine toxicity      Headache                            0
Vitamin B12 deficiency Hyporeflexia                        0    
Vitamin B12 deficiency Hypoaesthesia Spinthalamic          1

Вы бы тогда взяли этоили еще два шага, и есть таблица симптомов, таблица условий и таблица, в которой указано, какой симптом относится к какому состоянию и как.

0 голосов
/ 07 июня 2019

Шаблон запроса был бы гораздо более простым, если бы таблица была разработана в соответствии с нормативными шаблонами отношений.

Рассмотрим набор результатов, возвращаемый запросом этой формы:

SELECT v.condition
     , v.symptom
     , v.associated_or_excluded
  FROM ( SELECT t1.`Condition`  AS `condition`
              , 'Diarrhoea'     AS `symptom`
              , t1.`Diarrhoea`  AS `associated_or_excluded`
           FROM mytable t1
          UNION ALL
         SELECT t2.`Condition`
              , 'Headache'
              , t2.`Headache`
           FROM mytable t2
          UNION ALL
         SELECT t3.`Condition`
              , 'Hyporeflexia'
              , t3.`Hyporeflexia`
           FROM mytable t3
          UNION ALL
         SELECT t4.`Condition`
              , 'Hypoaesthesia_Spinothalamic'
              , t4.`Hypoaesthesia_Spinothalamic`
           FROM mytable t4
       ) v

Мы могли бы использовать этот запрос в качестве встроенного представления (источника строк) для внешнего запроса, или для преобразования можно было бы заполнить новую таблицу результатом этого запроса INSERT ... SELECT.


С этим набором результатов, с данными в стандартной реляционной форме, мы избегаем борьбы, написав простой запрос, подобный этому:

SELECT t.symptom
  FROM ( ... ) t
 WHERE t.condition              = 'Hyporeflexia'
   AND t.associated_or_excluded = 2

, который вернет симптомы, исключенные из определенного состояния.

(или, если выразиться в терминах исходного вопроса, где значение 2 находится на пересечении m и n )

Обратите внимание, что ( ... ) заменяется именем таблицы или встроенным представлением, возвращающим результат запроса выше.

Обратите внимание, что вся "борьба" находится внутри скобок, с запросом встроенного представления, который получает данные, представленные в подходящей форме.

SELECT t.symptom
  FROM ( -- inline view query 

         SELECT t1.`Condition`  AS `condition`
              , 'Diarrhoea'     AS `symptom`
              , t1.`Diarrhoea`  AS `associated_or_excluded`
           FROM mytable t1
          UNION ALL
         SELECT t2.`Condition`
              , 'Headache'
              , t2.`Headache`
           FROM mytable t2
          UNION ALL
         SELECT t3.`Condition`
              , 'Hyporeflexia'
              , t3.`Hyporeflexia`
           FROM mytable t3
          UNION ALL
         SELECT t4.`Condition`
              , 'Hypoaesthesia_Spinothalamic'
              , t4.`Hypoaesthesia_Spinothalamic`
           FROM mytable t4

      ) t
WHERE t.condition              = 'Hyporeflexia'
  AND t.associated_or_excluded = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...