如何使MySql View在获取时筛选每个表

时间:2014-08-28 08:42:55

标签: mysql sql union sql-view

我认为女巫的工作是这样的:

CREATE VIEW v_myView as SELECT * FROM(
      (SELECT a,b,c,d FROM table1)
    UNION ALL
      (SELECT a,b,c,d FROM table2)
    UNION ALL
      (SELECT a,b,c,d FROM table3)
    .
    .
    .) 

当我使用视图时,我会像这样过滤它:

SELECT * FROM v_myView WHERE a=x

虽然这有效,但需要一个小时(一小时,而不是图形)。如果我会这样做一个查询:

SELECT * FROM(
      (SELECT a,b,c,d FROM table1 WHERE a=x)
    UNION ALL
      (SELECT a,b,c,d FROM table2 WHERE a=x)
    UNION ALL
      (SELECT a,b,c,d FROM table3 WHERE a=x)
    .
    .
    .) 

需要一分钟。这让我想知道是否有办法让MySql自动执行,这意味着WHERE命令在每个表被提取之前都会起作用

1 个答案:

答案 0 :(得分:2)

正如您可能已经知道的那样,第二种方法更快,因为与第一种方法不同,它不会从所有三个表中获取所有结果,然后进行过滤。

Leonard Strashnoy(https://stackoverflow.com/a/5331792/3996196)的答案是解决这个问题的方法,但创建了一个定义过滤变量的函数。

这看起来如下所示:

功能(将Int替换为您的类型)

create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1;

查看

CREATE VIEW v_myView as SELECT * FROM(
      (SELECT a,b,c,d FROM table1 WHERE a=p1() )
    UNION ALL
      (SELECT a,b,c,d FROM table2 WHERE a=p1() )
    UNION ALL
      (SELECT a,b,c,d FROM table3 WHERE a=p1() )
    .
    .
    .) 

查询(用变量替换12)

SELECT * FROM (select @p1:=12 p) parm, v_myView;