假设我有以下2个表
CREATE TABLE `tablea` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`nameA` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tableb` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`idA` int(11) unsigned DEFAULT NULL,
`nameB` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idA` (`idA`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果我想有效地加入这两个表,我可以运行此查询
SELECT * FROM tableA AS a
INNER JOIN tableB AS b ON b.id = a.id
WHERE a.id = 20
让我们说我不能像上面的例子那样使用INNER JOIN
,而是我必须使用像这样的子查询
SELECT * FROM tableA AS a
INNER JOIN (
SELECT * FROM tableB
) AS b ON b.id = a.id
WHERE a.id = 20;
由于子查询是派生查询,MySQL将从tableB
中提取所有记录,然后从tableA
“WHERE id = 20
”中提取1条记录,最后它将2个数据集连接在一起。
如果第二个查询是这样编写的,我可以像这样调整它“假设我不能使用语法是上面的查询1”
SELECT * FROM tableA AS a
INNER JOIN (
SELECT * FROM tableB
WHERE id = 20
) AS b ON b.id = a.id
WHERE a.id = 20;
我想在这里解释的问题是这个;假设tableA
和tableB
是一个视图而不是表,每个视图都有一个复杂的查询“多个连接”。
而且,我想将两个观点加在一起ON a.id = b.ida
。我将无法将WHERE id = 20
子句添加到子查询中,因为MySQL不支持子查询“每个查询都必须是单个视图。”
CREATE VIEW viewA AS SELECT * FROM tableA;
CREATE VIEW viewB AS SELECT * FROM tableB;
CREATE VIEW viewAll AS
SELECT b。* FROM tableA AS a INNER JOIN tableB AS b ON b.ida = a.id
SELECT * FROM viewAll WHERE id = 20;
如何在使用视图时优化此查询?
我需要告诉MySQL只提取由id = 20
子句设置的ON
的记录。
这是一个SQL Fiddle,它包含表/视图和一些示例数据 感谢你的帮助。