在以下条件下从2个不同的表中收集数据

时间:2015-02-25 06:10:45

标签: mysql sql database join subquery

我有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 NULLidUser为1的所有数据。
  2. 获取pastsurgicalhistory idPatient为2的所有数据。
  3. 如您所见,pastsurgicalhistory的外键是pastsergicalhistory_type的主键。

    我尝试了以下查询,但它给了我错误的结果。它仅显示pastsurgicalhistory中可用的内容。不显示pastsergicalhistory_type中不在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 中的数据(遵循第1点中的条件)。

    AND pastsurgicalhistory.idPatient=2

    那么,我该如何解决这个问题?

    修改

    如果我在where子句中使用idPatient,它实际上会过滤“整个”结果集。这将给出pastsurgicalhistory与2相关的结果。但正如我所提到的,我需要{{1}}表中没有的数据。

3 个答案:

答案 0 :(得分: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)  ;

答案 1 :(得分:0)

使用paraenthises?

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

即使它没有括号,我也会说使用它可以使它更具可读性。

答案 2 :(得分:0)

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