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

これらをテーブルに結合して、画像行を関連する画像バージョン行にリンクしたいと思います。参加する順番は本当に重要ですか?私が行う場合の違いは何ですか:

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
4

1 に答える 1

1

sを実行しているleft joinため、2 つのクエリには大きな違いがあります。

image_e1 つ目は、一致するレコードとともにすべてのレコードをに保持しimage_version_eます。

image_version_e2 番目は、一致するレコード sin と共にすべてのレコードを保持しますimage_e

これら 2 つのうち、アプリケーションにとって意味的に正しい方を使用する必要があります。

あなたが本当に欲しいのはかなり可能ですinner join

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

内部結合では、結合順序は違いを生むべきではありません (コンパイラーは最適な順序と見なされるものを選択します)。

于 2013-05-17T20:34:40.587 に答える