MySQL SELECT DISTINCT 与多个 JOINS

标签 mysql select join distinct

我正在尝试从 MySQL 数据库中进行选择并获取唯一的结果集,如下所示。我认为我的问题是我对 LEFT Join 的理解不够好。或者,也许我需要使用不同的连接方法。

这是数据库的描述。

tbAdult(成人)有 x 个 tbchild( child ),并使用名为 tbadultchildxref 的交叉引用表。该表有一个成人和 child 的 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 的不同组合等,但我似乎无法理解它。

在此过程中,我的另一个问题是我需要检查“成人”、“ child ”和“程序”中的“事件”字段是否等于结果集的 1(真)。

提前致谢。

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

最佳答案

无需 LEFT JOIN:

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

此外,您可能需要检查 tblchild 中的 fkChildProgram int(1) DEFAULT NULL, - 它引用的列定义为 int(11)

此时,您实际上不需要检查 Adult 是否处于事件状态(因为这是您开始时的搜索条件),但如果您必须这样做 - 只需将其添加到加入列表的末尾即可:

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

关于MySQL SELECT DISTINCT 与多个 JOINS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10690303/

相关文章:

php - 使用 group by 正确连接 4 个表

python - Pandas 将一个数据框叠加在另一个数据框上

php - 为 PHP 脚本的 POST 请求创建任务以在 MySQL 数据库中添加条目

mysql重命名结果?

php - MYSQL查询JOIN多个字段到一个字段

python - 让selenium从输入框中选择一个数字python

java - 选择特定字段不为 NULL 的所有记录

INSERT FROM SELECT 之后使用 keycache 修复 MySQL

mysql - 无需插入即可在数据库中获取最后一个 ID 的有效方法?

java - 从单个线程中的多个 BlockingQueues 中读取