我应该以哪种顺序加入我的两张桌子?

时间:2013-05-17 20:22:03

标签: sql join key

我有以下表格:

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");

我想将这些连接到表格以将图像行与其关联的图像版本行链接起来。我加入他们的顺序真的很重要吗?如果我这样做有什么区别:

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

而不是:

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

1 个答案:

答案 0 :(得分:1)

您正在进行left join,因此两个查询之间存在很大差异。

第一个记录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;

使用内部联接,联接顺序不应该有所不同(编译器将选择它认为最佳顺序)。