如何在加入多个视图时优化MySQL子查询?

时间:2015-06-04 23:51:49

标签: mysql sql database join views

假设我有以下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中提取所有记录,然后从tableAWHERE 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;

我想在这里解释的问题是这个;假设tableAtableB是一个视图而不是表,每个视图都有一个复杂的查询“多个连接”。  而且,我想将两个观点加在一起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,它包含表/视图和一些示例数据 感谢你的帮助。

0 个答案:

没有答案