我有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');
答案 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条记录。