2016-10-14 4 views
0

У меня есть два запроса MySQL, которые дают результаты, которые я ищу. В конечном итоге я хотел бы объединить эти два запроса, чтобы создать единый стол, и я застрял.Несколько MySQL JOINs и дублированные ячейки

Запрос 1:

SELECT scoc.isr, outcome_concept_id, concept_name as outcome_name 
FROM standard_case_outcome AS sco INNER JOIN concept AS c 
ON sco.outcome_concept_id = c.concept_id 
INNER JOIN standard_case_outcome_category AS scoc 
ON scoc.isr = sco.isr 
WHERE scoc.outc_code = 'CA' 

РЕЗУЛЬТАТ 1:

RESULT OF QUERY 1 (TRUNCATED)

QUERY 2:

SELECT scoc.isr, drug_seq, concept_id, concept_name as drug_name 
FROM standard_case_drug AS scd INNER JOIN concept AS c 
ON scd.standard_concept_id = c.concept_id 
INNER JOIN standard_case_outcome_category AS scoc 
ON scoc.isr = scd.isr 
WHERE scoc.outc_code = 'CA' 

РЕЗУЛЬТАТ 2:

RESULT OF QUERY 2 (TRUNCATED)

DESIRED РЕЗУЛЬТАТ: DESIRED RESULT

Я довольно уверен, что я могу понять, как сделать это с помощью Python/панды, но мне было интересно, если есть (а) способ сделать это MySQL (б) любая польза для этого с MySQL.

** Если вам интересно, this is the entire dataset.

Вот структура БД для соответствующих таблиц:

# Dump of table concept 
# ------------------------------------------------------------ 

CREATE TABLE `concept` (
    `concept_id` int(11) NOT NULL, 
    `concept_name` varchar(255) NOT NULL, 
    `domain_id` varchar(20) NOT NULL, 
    `vocabulary_id` varchar(20) NOT NULL, 
    `concept_class_id` varchar(20) NOT NULL, 
    `standard_concept` varchar(1) DEFAULT NULL, 
    `concept_code` varchar(50) NOT NULL, 
    `valid_start_date` date NOT NULL, 
    `valid_end_date` date NOT NULL, 
    `invalid_reason` varchar(1) DEFAULT NULL, 
    PRIMARY KEY (`concept_id`), 
    UNIQUE KEY `idx_concept_concept_id` (`concept_id`), 
    KEY `idx_concept_code` (`concept_code`), 
    KEY `idx_concept_vocabluary_id` (`vocabulary_id`), 
    KEY `idx_concept_domain_id` (`domain_id`), 
    KEY `idx_concept_class_id` (`concept_class_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



# Dump of table standard_case_drug 
# ------------------------------------------------------------ 

CREATE TABLE `standard_case_drug` (
    `primaryid` varchar(512) DEFAULT NULL, 
    `isr` varchar(512) DEFAULT NULL, 
    `drug_seq` varchar(512) DEFAULT NULL, 
    `role_cod` varchar(512) DEFAULT NULL, 
    `standard_concept_id` int(11) DEFAULT NULL, 
    KEY `idx_standard_case_drug_primary_id` (`primaryid`(255),`drug_seq`(255)), 
    KEY `idx_standard_case_drug_isr` (`isr`(255),`drug_seq`(255)), 
    KEY `idx_standard_case_drug_standard_concept_id` (`standard_concept_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



# Dump of table standard_case_outcome 
# ------------------------------------------------------------ 

CREATE TABLE `standard_case_outcome` (
    `primaryid` varchar(512) DEFAULT NULL, 
    `isr` varchar(512) DEFAULT NULL, 
    `pt` varchar(512) DEFAULT NULL, 
    `outcome_concept_id` int(11) DEFAULT NULL, 
    `snomed_outcome_concept_id` int(11) DEFAULT NULL, 
    KEY `idx_standard_case_outcome_primary_id` (`primaryid`(255)), 
    KEY `idx_standard_case_outcome_isr` (`isr`(255)), 
    KEY `idx_standard_case_outcome_outcome_concept_id` (`outcome_concept_id`), 
    KEY `idx_standard_case_outcome_snomed_outcome_concept_id` (`snomed_outcome_concept_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



# Dump of table standard_case_outcome_category 
# ------------------------------------------------------------ 

CREATE TABLE `standard_case_outcome_category` (
    `primaryid` varchar(512) DEFAULT NULL, 
    `isr` varchar(512) DEFAULT NULL, 
    `outc_code` varchar(512) DEFAULT NULL COMMENT 'Code for a patient outcome (See table below) CODE MEANING_TEXT ----------------DE Death LT Life-ThreateningHO Hospitalization - Initial or ProlongedDS DisabilityCA Congenital AnomalyRI Required Intervention to Prevent PermanentImpairment/DamageOT Other Serious (Important Medical Event) NOTE: The outcome from the latest version of a case is provided. If there is more than one outcome, the codes willbe line listed.', 
    `snomed_concept_id` int(11) DEFAULT NULL, 
    KEY `idx_standard_case_outcome_category_primary_id` (`primaryid`(255)), 
    KEY `idx_standard_case_outcome_category_isr` (`isr`(255)), 
    KEY `idx_standard_case_outcome_category_snomed_concept_id` (`snomed_concept_id`,`outc_code`(255)) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+1

Необходимо предоставить образцы данных и желаемые результаты. Промежуточные запросы на самом деле не объясняют вашу структуру данных. –

+0

Спасибо за отзыв, @GordonLinoff. Набор данных составляет почти 1 ГБ, поэтому мне нужно подумать о том, как получить небольшой сегмент, который все равно будет предоставлять результаты. Что касается структуры, я сделаю это обновление сейчас. – Ryan

ответ

1

Это вы должны получить желаемые результаты.

SELECT 
    `scoc`.`isr`    AS `isr`, 
    `sco` .`outcome_concept_id` AS `outcome_concept_id`, 
    `c1` .`concept_name`  AS `outcome_name`, 
    `scd` .`drug_seq`   AS `drug_seq`, 
    `scd` .`concept_id`   AS `concept_id`, 
    `c2` .`concept_name`  AS `drug_name` 
FROM 
    `standard_case_outcome` AS `sco` 
INNER JOIN 
    `concept` AS `c1` 
    ON 
     `sco`.`outcome_concept_id` = `c1`.`concept_id` 
LEFT JOIN 
    `standard_case_drug` AS `scd` 
    ON 
     `sco`.`isr` = `scd`.`isr` 
INNER JOIN 
    `concept` AS `c2` 
    ON 
     `scd`.`outcome_concept_id` = `c2`.`concept_id` 
INNER JOIN 
    `standard_case_outcome_category` AS `scoc` 
    ON 
     `scoc`.`isr` = `sco`.`isr` 
WHERE 
    `scoc`.`outc_code` = 'CA' 

EDIT

Обратите внимание, что я ушел из concept таблицу, так как вы ничего не выбирая из него, или фильтрации результатов с ним.

ВТОРОЙ EDIT

Обновлено включить concept таблицу. Обновленный вопрос показал, что он действительно необходим в SELECT.

ТРЕТИЙ EDIT

необходимо выбрать concept. name для sco и scd соответственно.

+0

Спасибо @ ÞóiJuhasz. Это было невероятно быстро. concept_name, действительно, исходит из таблицы концепций. – Ryan

+0

Вот где ваше обновление к сообщению пригодилось. Извините за допущение, я соответствующим образом обновлю ответ. :) –

+0

Это кажется очень близким после второго редактирования. Строка 'scd' .'concept_name' AS' drug_name' дает ошибку, потому что имя понятия не находится в таблице 'scd'. Он находится в таблице 'c'. Поскольку имя result и имя_файла оба исходят из таблицы понятий, как определено concept_id, это не позволяет просто изменить 'c'.'concept_name' AS' drug_name' – Ryan