0

以下に示すように、MySQLデータベースからSELECTを実行し、一意の結果セットを取得しようとしています。私の問題は、LEFT結合を十分に理解していないことだと思います。または、別の参加アプローチを使用する必要があるかもしれません。

これがデータベースの説明です。

tbAdult(Adults)にはx個のtbchild(Children)があり、tbadultchildxrefと呼ばれる相互参照テーブルを使用します。このテーブルには、大人と子供の両方のファンクションキーがあります。これらの2つのテーブルの間には多対多の関係があり、簡単にするために削除したx-refに保持されている他のデータがあるため、x-refテーブルを使用する必要があります。

次に、各子はプログラム(tblprogram)に属します。

各プログラムにはx個のカメラ(tblCamera)があります。繰り返しますが、多対多の関係やその他の理由により、tblProgramとtblCameraの間でx-refテーブルを使用する必要があります。

私が得ようとしているのは、特定の親のためのカメラのユニークなリストです。

たとえば、親675には3つの子、子ID 789、788、および789があります。これらの3つの子は、プログラムID 4、5、および6に属します。

プログラムID4のカメラIDは1,2,3プログラムID5のカメラIDは4,5,6プログラムID6のカメラIDは1,6,7,8

結果セットを1、2、3、4、5、6、7、8にします。

さまざまな外部参照テーブルなどでSELECTDISTINCT、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`)
4

2 に答える 2

3

左結合は必要ありません:

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,tblchildをチェックすることもできます-それが参照する列は次のように定義されていますint(11)

この時点で、Adultがアクティブであるかどうかを実際に確認する必要はありません(これは最初に開始した検索条件であるため)が、必要な場合は、これを参加リストの最後に追加するだけです。

JOIN tbladult ON tbladultchildxref.fkadultid = tbladult.pkadultid
  AND tbladult.fldAdultActive = 1
于 2012-05-21T18:20:58.653 に答える
0

長い説明です。私が質問を正しく理解していれば、このクエリはあなたを助けるはずです-

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 
于 2012-05-21T18:22:23.977 に答える