2016-09-22 21 views
0

研製了在另一臺

間接引用選擇行考慮這個腳本來創建一個MySQL虛擬數據庫:

CREATE SCHEMA `zzz_dummy` ; 
CREATE TABLE `zzz_dummy`.`subtable2` (
    `id` INT NOT NULL UNIQUE, 
    `col1` VARCHAR(45) NULL, 
    PRIMARY KEY (`id`)); 
CREATE TABLE `zzz_dummy`.`subtable1` (
    `id` INT NOT NULL UNIQUE, 
    `ref_subtab2` INT NULL, 
    PRIMARY KEY (`id`)); 
CREATE TABLE `zzz_dummy`.`maintable` (
    `id` INT NOT NULL UNIQUE, 
    `ref_subtab1` INT NULL, 
    PRIMARY KEY (`id`)); 

ALTER TABLE `zzz_dummy`.`maintable` 
ADD INDEX `fk_subtab1_idx` (`ref_subtab1` ASC); 
ALTER TABLE `zzz_dummy`.`maintable` 
ADD CONSTRAINT `fk_subtab1` 
    FOREIGN KEY (`ref_subtab1`) 
    REFERENCES `zzz_dummy`.`subtable1` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 


ALTER TABLE `zzz_dummy`.`subtable1` 
ADD INDEX `fk_subtab2_idx` (`ref_subtab2` ASC); 
ALTER TABLE `zzz_dummy`.`subtable1` 
ADD CONSTRAINT `fk_subtab2` 
    FOREIGN KEY (`ref_subtab2`) 
    REFERENCES `zzz_dummy`.`subtable2` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

INSERT INTO zzz_dummy.subtable2 VALUES 
    (1,'ref_val_1'), 
    (2,'ref_val_2'), 
    (3,'no_ref'); 

INSERT INTO zzz_dummy.subtable1 VALUES 
    (1,'1'), 
    (2,'2'), 
    (3,'3'); 

INSERT INTO zzz_dummy.maintable VALUES 
    (1,'1'), 
    (2,'2'), 
    (3,'1'), 
    (4,'1'), 
    (5,'2'), 
    (6,'1'); 

這將產生如下表和條目:

maintable: 
+----+-------------+ 
| id | ref_subtab1 | 
+----+-------------+ 
| 1 |   1 | 
| 3 |   1 | 
| 4 |   1 | 
| 6 |   1 | 
| 2 |   2 | 
| 5 |   2 | 
+----+-------------+ 

subtable1: 
+----+-------------+ 
| id | ref_subtab2 | 
+----+-------------+ 
| 1 |   1 | 
| 2 |   2 | 
| 3 |   3 | 
+----+-------------+ 

subtable2: 
+----+-----------+ 
| id | col1  | 
+----+-----------+ 
| 1 | ref_val_1 | 
| 2 | ref_val_2 | 
| 3 | no_ref | 
+----+-----------+ 

問題

正如你所看到的,列在ref_subtab1參考maintableidsubtable1,其中列ref_subtab2最後引用了subtable2id。我想選擇以上述方式間接引用的subtable2中的所有行。

我已經試過

SELECT subtable2.* FROM zzz_dummy.subtable2 
    INNER JOIN zzz_dummy.maintable 
    INNER JOIN zzz_dummy.subtable1 
    WHERE zzz_dummy.maintable.ref_subtab1=zzz_dummy.subtable1.id 
    AND zzz_dummy.subtable1.ref_subtab2=zzz_dummy.subtable2.id; 

但這返回6分的結果,一個是每場比賽中maintable

+----+-----------+ 
| id | col1  | 
+----+-----------+ 
| 1 | ref_val_1 | 
| 1 | ref_val_1 | 
| 1 | ref_val_1 | 
| 1 | ref_val_1 | 
| 2 | ref_val_2 | 
| 2 | ref_val_2 | 
+----+-----------+ 

我不想重複值,我想它返回:

+----+-----------+ 
| id | col1  | 
+----+-----------+ 
| 1 | ref_val_1 | 
| 2 | ref_val_2 | 
+----+-----------+ 

這可以通過MySQL語句有效地完成嗎?

+0

使用'distinct'。由於一對多關係,您正在獲取冗餘行。 –

+0

@vkp我的方法至少有效嗎?還是有更好的方法來做到這一點? – nautical

回答

0

由於已經評論使用distinct,以獲得獨特的結果組合,也從WHERE條款搬完條件JOIN ON條件像

SELECT distinct subtable2.* 
FROM zzz_dummy.subtable2 
    INNER JOIN zzz_dummy.subtable1 
    ON zzz_dummy.subtable1.ref_subtab2 = zzz_dummy.subtable2.id 
    INNER JOIN zzz_dummy.maintable 
ON zzz_dummy.maintable.ref_subtab1 = zzz_dummy.subtable1.id;