繁体   English   中英

MySQL SELECT DISTINCT具有多个联接

[英]MySQL SELECT DISTINCT with multiple JOINS

我正在尝试从MySQL数据库中进行选择并获得唯一的结果集,如下所示。 我的问题是,我认为我不太了解LEFT Joins。 或者,也许我需要使用其他的Join方法。

这是数据库的描述。

tbAdult(Adults)具有x的tbchild(Children)数量,并使用称为tbadultchildxref的交叉引用表。 该表有一个成人和儿童的F键。 我必须使用外部参照表,因为这两个表之间存在多对多关系,并且其他数据保留在外部参照中,为简单起见,我将其删除。

反过来,每个子级都属于一个程序(tblprogram)。

每个程序都有x个摄像机(tblCamera)。 同样,由于多对多关系以及其他原因,我必须在tblProgram和tblCamera之间使用外部参照表。

我想要了解的是给定父母的唯一摄像机列表。

例如,父母675有三个孩子,孩子ID为789,788和789。这三个孩子又属于计划ID的4、5和6。

程序ID 4具有摄像机ID的1,2,3程序ID 5具有摄像机ID的4,5,6程序ID 6具有摄像机ID的1,6,7,8

我希望结果集是1,2,3,4,5,6,7,8

我尝试了在各种外部参照表上执行SELECT DISTINCT,LEFT JOINS的不同组合等操作,但是我似乎无法理解。

我的另一个问题是,我需要检查结果集的“成人”,“儿童”和“程序”中的“活动”字段是否等于= 1(true)。

提前致谢。

CREATE TABLE `tbladult` (
 `pkAdultID` int(11) NOT NULL AUTO_INCREMENT,
 `fldAdultActive` tinyint(1) DEFAULT '1',
 `fldAdultLogin` varchar(30) DEFAULT NULL,
 `fldAdultPassword` varchar(45) DEFAULT NULL,
 `fldAdultFirstName` varchar(60) DEFAULT NULL,
 `fldAdultLastName` varchar(60) DEFAULT NULL,
 PRIMARY KEY (`pkAdultID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;


/*Table structure for table `tblchild` */

CREATE TABLE `tblchild` (
 `pkChildID` int(11) NOT NULL AUTO_INCREMENT,
 `fldChildActive` tinyint(4) DEFAULT NULL,
 `fldChildFirstName` varchar(45) DEFAULT NULL,
 `fldChildLastName` varchar(45) DEFAULT NULL,
 `fkChildProgram` int(1) DEFAULT NULL,
 PRIMARY KEY (`pkChildID`),
 KEY `FK_tblchild` (`fkChildProgram`),
 CONSTRAINT `FK_tblchild` FOREIGN KEY (`fkChildProgram`) REFERENCES `tblprogram` (`pkProgramID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;


/*Table structure for table `tbladultchildxref` */

CREATE TABLE `tbladultchildxref` (
 `pkAdultChildxRefID` int(11) NOT NULL AUTO_INCREMENT,
 `fldAdultChildxRefActive` tinyint(1) DEFAULT '1',
 `fkAdultID` int(11) DEFAULT NULL,
 `fkChildID` int(11) DEFAULT NULL,
 PRIMARY KEY (`pkAdultChildxRefID`),
 KEY `FK_tbladultchildxref` (`fkAdultID`),
 KEY `FK_tbladultchildxref2` (`fkChildID`),
 CONSTRAINT `FK_tbladultchildxref` FOREIGN KEY (`fkAdultID`) REFERENCES `tbladult` (`pkAdultID`),
 CONSTRAINT `FK_tbladultchildxref2` FOREIGN KEY (`fkChildID`) REFERENCES `tblchild` (`pkChildID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;



/*Table structure for table `tblprogram` */

CREATE TABLE `tblprogram` (
  `pkProgramID` int(11) NOT NULL AUTO_INCREMENT,
  `fldProgamActive` tinyint(1) DEFAULT '1',
  `fldProgramName` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`pkProgramID`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

/*Table structure for table `tblcamera` */

CREATE TABLE `tblcamera` (
 `pkCameraID` int(11) NOT NULL AUTO_INCREMENT,
 `fldCameraName` varchar(50) DEFAULT NULL,
 `fldCameralocation` varchar(50) DEFAULT NULL,
 `fldCameraURL` varchar(250) DEFAULT NULL,
 PRIMARY KEY (`pkCameraID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;


/*Table structure for table `tblprogramcameraxref` */

CREATE TABLE `tblprogramcameraxref` (
 `pkProgramCameraXrefID` int(11) NOT NULL AUTO_INCREMENT,
 `fkProgramID` int(11) DEFAULT NULL,
 `fkCameraID` int(11) DEFAULT NULL,
 PRIMARY KEY (`pkProgramCameraXrefID`),
 KEY `FK_tblprogramcameraxref` (`fkProgramID`),
 KEY `FK_camerasforprograms` (`fkCameraID`),
 CONSTRAINT `FK_camerasforprograms` FOREIGN KEY (`fkCameraID`) REFERENCES `tblcamera`     (`pkCameraID`),
 CONSTRAINT `FK_tblprogramcameraxref` FOREIGN KEY (`fkProgramID`) REFERENCES `tblprogram` (`pkProgramID`)

无需左联接:

SELECT DISTINCT tblprogramcameraxref.fkcameraid
FROM tblprogramcameraxref
JOIN tblprogram ON tblprogramcameraxref.fkprogramid = tblprogram.pkprogramid
  AND tblprobram.fldProgramActive = 1
JOIN tblchild ON tblprogramcameraxref.fkprogramid = tblchild.fkchildprogram 
  AND tblchild.fldChildActive = 1
JOIN tbladultchildxref ON tblchild.pkchildid = tbladultchildxref.fkchildid
  AND tbladultchildxref.fldAdultChildxRefActive = 1
WHERE tbladultchildxref.fkadultid = 675

另外,您可能希望在fkChildProgram int(1) DEFAULT NULL,检查fkChildProgram int(1) DEFAULT NULL, NULL-它引用的列定义为int(11)

在这一点上,您实际上不需要检查“成人”是否处于活动状态(因为这是您开始使用的搜索条件),但是如果必须这样做,只需将其添加到联接列表的末尾即可:

JOIN tbladult ON tbladultchildxref.fkadultid = tbladult.pkadultid
  AND tbladult.fldAdultActive = 1

这是一个很长的描述。 如果我已正确理解问题,则此查询应为您提供帮助-

SELECT DISTINCT pcref.fkCameraID
FROM tbladult adult,
     tblchild child,
     tbladultchildxref acref,
     tblprogram prog,
     tblcamera camera,
     tblprogramcameraxref pcref
WHERE adult.pkAdultID = 675
AND adult.fldAdultActive = TRUE
AND adult.pkAdultID = acref.fkAdultID
AND acref.fkChildID = child.pkChildID 
AND child.fldChildActive = TRUE
AND child.fkChildProgram = prog.pkProgramID 
AND prog.fldProgamActive = TRUE
AND prog.pkProgramID = pcref.fkProgramID 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM