从 2 个不同的表中收集数据,条件如下

Collect data from 2 different tables, following conditions

我有 2 个 MySQL table。一个是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 获取所有数据,其中 idUserNULLidUser 是 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

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

编辑

如果我在 where 子句中使用 AND pastsurgicalhistory.idPatient=2,它实际上会过滤 "entire" 结果集。这将给我 idPatient 与 2 相关的结果。但是正如我提到的,我需要 pastsurgicalhistory table 中也没有的数据。

使用副词?

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

我相信 return idUser 为 1 的结果 and idPatient 为 2 or iduser 为 null

试试这个:

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

即使它不带括号也能为您工作,我会说最好使用它来提高可读性。

尝试

  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)  ;

移动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