2015-02-25 2 views
0

У меня есть 2 таблицы MySQL. Одним из них является pastsergicalhistory_type, а другой является pastsurgicalhistoryСоберите данные из двух разных таблиц, следующие условия

Ниже pastsergicalhistory_type

CREATE TABLE `pastsergicalhistory_type` (
`idPastSergicalHistory_Type` int(11) NOT NULL AUTO_INCREMENT, 
`idUser` int(11) DEFAULT NULL, 
`Name` varchar(45) NOT NULL, 
PRIMARY KEY (`idPastSergicalHistory_Type`), 
KEY `fk_PastSergicalHistory_Type_User1_idx` (`idUser`), 
CONSTRAINT `fk_PastSergicalHistory_Type_User1` FOREIGN KEY (`idUser`) REFERENCES `user` (`idUser`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 

Ниже pastsurgicalhistory

CREATE TABLE `pastsurgicalhistory` (
`idPastSurgicalHistory` int(11) NOT NULL AUTO_INCREMENT, 
`idPatient` int(11) NOT NULL, 
`idPastSergicalHistory_Type` int(11) NOT NULL, 
`Comment` varchar(45) DEFAULT NULL, 
`ActiveStatus` tinyint(1) NOT NULL, 
`LastUpdated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
PRIMARY KEY (`idPastSurgicalHistory`), 
KEY `fk_PastSurgicalHistory_Patient1_idx` (`idPatient`), 
KEY `fk_PastSurgicalHistory_PastSergicalHistory_Type1_idx` (`idPastSergicalHistory_Type`), 
CONSTRAINT `fk_PastSurgicalHistory_PastSergicalHistory_Type1` FOREIGN KEY (`idPastSergicalHistory_Type`) REFERENCES `pastsergicalhistory_type` (`idPastSergicalHistory_Type`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
CONSTRAINT `fk_PastSurgicalHistory_Patient1` FOREIGN KEY (`idPatient`) REFERENCES `patient` (`idPatient`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 

Теперь мое требование, как это, я объясню это в виде пунктов.

  1. Получить все данные из pastsergicalhistory_type где idUser является NULL или idUser равен 1.
  2. Получить все данные из pastsurgicalhistory где idPatient является 2.

, как вы можете видеть, как внешний ключ pastsurgicalhistory является основной ключ pastsergicalhistory_type.

Я попробовал следующий запрос, но это дало мне неправильные результаты. Он отображает только то, что доступно в pastsurgicalhistory. Данные в pastsergicalhistory_type (которые следуют за условием в пункте 1), который не находится в pastsurgicalhistory, не отображаются.

SELECT pastsergicalhistory_type.*, 
    pastsurgicalhistory.* 
    FROM pastsergicalhistory_type 
    LEFT JOIN pastsurgicalhistory ON pastsurgicalhistory.`idPastSergicalHistory_Type` = pastsergicalhistory_type.`idPastSergicalHistory_Type` 
    WHERE pastsergicalhistory_type.idUser = NULL OR pastsergicalhistory_type.idUser=1 AND pastsurgicalhistory.idPatient=2 

Итак, как я могу решить эту проблему?

EDIT

Если я использую AND pastsurgicalhistory.idPatient=2 в моем где положение, он фактически фильтрует «весь» набор результатов. Это даст мне результаты, когда idPatient связан с 2. Но, как я уже упоминал, мне нужны данные, которые также недоступны в таблице pastsurgicalhistory.

+0

Используйте скобки в вашем ИНЕКЕ, что может быть причиной вы получаете неожиданные результаты ..(A OR B) И C. Кроме того, у вас есть условие на pastsurgicalhistory, возможно, именно поэтому вы не получаете все строки в pastsergicalhistory_type – SoulTrain

+0

на основе вашего недавнего редактирования, coudnt вы делаете 'OR'? Некоторые вещи вроде (A 'OR' B)' OR' pastsurgicalhistory.idPatient = 2 – SoulTrain

+0

@SoulTrain: Нет. Это снова неправильно. –

ответ

1

Попробуйте

SELECT pastsergicalhistory_type.*, 
    pastsurgicalhistory.* 
    FROM pastsergicalhistory_type 
    LEFT JOIN pastsurgicalhistory ON 
    (pastsurgicalhistory.`idPastSergicalHistory_Type` = 
     pastsergicalhistory_type.`idPastSergicalHistory_Type` and 
    pastsurgicalhistory.idPatient=2) 
    WHERE (pastsergicalhistory_type.idUser = NULL OR 
    pastsergicalhistory_type.idUser=1) ; 
+0

Если я использую 'AND pastsurgicalhistory.idPatient = 2' в моем предложении where, он фактически фильтрует« полный »набор результатов. Это даст мне результаты, когда 'idPatient' связан с 2. Но, как я уже упоминал, мне нужны данные, которые также недоступны в таблице« pastsurgicalhistory ». –

+0

Затем добавить и pastsurgicalhistory.idPatient = 2 в левое соединение состояние как (pastsurgicalhistory.'idPastSergicalHistory_Type' = pastsergicalhistory_type.'idPastSergicalHistory_Type' и pastsurgicalhistory.idPatient = 2) –

+0

вы можете изменить свой код? –

0

Использовать парадентизы?

WHERE pastsergicalhistory_type.idUser = NULL OR pastsergicalhistory_type.idUser=1 AND pastsurgicalhistory.idPatient=2 

Я верю, что возвращать результаты, где idUser является 1 и idPatient является 2 или iduser является нулевым

Попробуйте это:

WHERE (pastsergicalhistory_type.idUser = NULL OR pastsergicalhistory_type.idUser=1) AND pastsurgicalhistory.idPatient=2 

Если я вас правильно понял ?

SELECT pastsergicalhistory_type.*, 
    pastsurgicalhistory.* 
    FROM pastsergicalhistory_type 
    RIGHT JOIN pastsurgicalhistory ON pastsurgicalhistory.`idPastSergicalHistory_Type` = pastsergicalhistory_type.`idPastSergicalHistory_Type` 
    WHERE (pastsergicalhistory_type.idUser = NULL OR pastsergicalhistory_type.idUser=1) AND pastsurgicalhistory.idPatient=2 

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

+0

Если я использую 'AND pastsurgicalhistory.idPatient = 2' в моем предложении where, он фактически фильтрует« полный »набор результатов. Это даст мне результаты, когда 'idPatient' связан с 2. Но, как я уже упоминал, мне нужны данные, которые также недоступны в таблице« pastsurgicalhistory ». –

+0

Не совсем уверен, что вы имеете в виду ... но ПРАВИЛЬНАЯ ВСТУПЛЕНИЕ, а не ВЛЕВО? – bestprogrammerintheworld

0

Move pastsurgicalhistory.idPatient=2 присоединиться к условию

SELECT pastsergicalhistory_type.*, 
pastsurgicalhistory.* 
FROM pastsergicalhistory_type 
LEFT JOIN pastsurgicalhistory ON pastsurgicalhistory.`idPastSergicalHistory_Type` = pastsergicalhistory_type.`idPastSergicalHistory_Type` 
           AND pastsurgicalhistory.idPatient=2 
WHERE pastsergicalhistory_type.idUser IS NULL OR pastsergicalhistory_type.idUser=1 
+0

Если я использую 'AND pastsurgicalhistory.idPatient = 2' в разделе my where, он фактически фильтрует« полный »набор результатов. Это даст мне результаты, когда 'idPatient' связан с 2. Но, как я уже упоминал, мне нужны данные, которые также недоступны в таблице« pastsurgicalhistory ». –

+0

move 'AND pastsurgicalhistory.idPatient = 2', чтобы присоединиться к условию. Таким образом, вы будете фильтровать только таблицу «pastsurgicalhistory». –