单选以使用2个不同的FK连接3个相关表

时间:2011-10-25 13:56:55

标签: mysql sql join left-join inner-join

我有3个表,其中2个表通过外键与第三个表相关。我想运行如下查询:

SELECT * 
FROM template AS t 
LEFT JOIN web_page_content AS wpc ON wpc.template_id = t.id

...仍然可以在标题和模板中获取公共ID。

CREATE TABLE template 
(
  id INT AUTO_INCREMENT NOT NULL, 
  uri VARCHAR(50) NOT NULL,    
  UNIQUE INDEX template_idx (uri), PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE web_page_content 
(
  id INT AUTO_INCREMENT NOT NULL, 
  template_id INT NOT NULL, 
  content VARCHAR(50) NOT NULL, 
  PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE header 
(
  id INT AUTO_INCREMENT NOT NULL, 
  template_id INT NOT NULL, 
  content VARCHAR(50) NOT NULL, 
  PRIMARY KEY(id)
) ENGINE = InnoDB;

ALTER TABLE web_page_content 
ADD CONSTRAINT FK_95E4B6E5627579FF FOREIGN KEY (template_id) 
    REFERENCES template(id) ON DELETE CASCADE;

ALTER TABLE header 
ADD CONSTRAINT FK_95E3B5E5627579FF FOREIGN KEY (template_id) 
    REFERENCES template(id) ON DELETE CASCADE;  

INSERT INTO `template` (`id`, `uri`) VALUES (NULL, 'my_dir/my_file_0'), (NULL, 'my_dir/my_file_1');

1 个答案:

答案 0 :(得分:0)

这是你在找什么?

select 
      t.ID,
      t.uri,
      h.ID as HeaderID,
      h.Content as HeaderContent,
      wpc.id as WebPageID,
      wpc.Content as WebContent
   from
      template t
         left join header h
            on t.id = h.template_id
         left join web_page_content wpc
            on t.id = wpc.template_id

- 编辑 -

澄清每个评论/反馈的子选择与加入。

在这种情况下,您可以通过模板ID以1:1的比例从一个表直接连接到另一个表。引擎直接在索引上找到匹配项,然后提取数据。它几乎就像引擎隐含地为你的密钥ID做一个(select / from / where)。我不明白它如何做到的全部内幕,它只是做得很好。通过执行子选择,您强制引擎为每个ID的模板表中的每个记录显式运行查询...假设您有20个模板和1000个Web内容页面。通过执行子选择(例如EXISTS)实际上,每个匹配的ID显式地运行select / from查询1000次。

对于笛卡儿,如果你刚刚列出了没有连接条件的“From”表,你会得到一个结果集,就像表“B”中的表“A”TIMES一样多,所以如果你做了一个简单的

select
     t.*,
     wpc.*
   from
      template t,
      web_page_content wpc
   order by...

没有WHERE(加入它们)或显式JOIN,并且上面的记录计数样本......结果集中最终会有20,000条记录。

相关问题