2013-05-17 77 views
0

我有以下表格:我應該以哪種順序加入我的兩張桌子?

CREATE TABLE IF NOT EXISTS "image_e" 
(
    "id" int unsigned NOT NULL AUTO_INCREMENT, 
    "title" varchar(32), 
    "alt" varchar(16) NOT NULL, 

    PRIMARY KEY ("id") 

) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_bin; 

CREATE TABLE IF NOT EXISTS "image_version_e" 
(
    "id"  int unsigned  NOT NULL AUTO_INCREMENT, 
    "imageId" int unsigned  NOT NULL, 
    "format" varchar(4)  NOT NULL, 
    "size" int unsigned  NOT NULL, 
    "width" smallint unsigned NOT NULL, 
    "height" smallint unsigned NOT NULL, 
    "src"  varchar(64)  NOT NULL, 

    PRIMARY KEY ("id") 

) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_bin; 

ALTER TABLE "image_version_e" 
    ADD UNIQUE KEY ("imageId", "format", "width", "height"), 
    ADD UNIQUE KEY ("src"); 

我想加入這些表的圖像一行它相關的影像版本行(S)連接。我加入他們的順序真的很重要嗎?是什麼,如果我做的區別:你是做left join這麼有兩個查詢之間有很大的區別

SELECT * 
FROM image_version_e 
LEFT JOIN image_e 
    ON image_e.id = image_version_e.id 
+0

對於'OUTER JOINS'(特別是''LEFT''和'RIGHT'),順序很重要。 –

+0

如果您發佈了一些* sample *數據和*期望的*結果,您將得到更準確的答案。 –

+0

我並不是真的需要查詢,我只是想知道使用這些查詢中的一個而不是另一個涉及的內容。 – Virus721

回答

1

SELECT * 
FROM image_e 
LEFT JOIN image_version_e 
    ON image_version_e.imageId = image_e.id 

代替。

第一個保留image_e中的所有記錄以及image_version_e中的匹配記錄。

第二個保留所有記錄在image_version_e以及匹配的記錄罪image_e

在這兩個中,您應該使用語義上正確的應用程序。

這很可能是你真正想要的inner join

SELECT * 
FROM image_e inner join 
    image_version_e 
    ON image_version_e.imageId = image_e.id; 

隨着內部連接,連接順序不應該有所作爲(編譯器會選擇它認爲是最好的順序) 。

+0

感謝您的回答! – Virus721