获取时如何使MySql视图过滤每个表

No *_*ame 5 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)
    .
    .
    .) 
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM v_myView WHERE a=x
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但需要一个小时(一个真正的小时,不是形象地说)。如果我会做这样的查询:

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)
    .
    .
    .) 
Run Code Online (Sandbox Code Playgroud)

这需要一分钟。这让我想知道是否有办法让 MySql 自动执行,这意味着该WHERE命令将在获取每个表之前工作

Nav*_*lal 3

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

Leonard Strashnoy 的答案(/sf/answers/373225471/)将是解决这个问题的一种方法,但创建一个定义过滤变量的函数。

这看起来像下面这样:

函数(将 Int 替换为您的类型)

create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1;
Run Code Online (Sandbox Code Playgroud)

看法

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() )
    .
    .
    .) 
Run Code Online (Sandbox Code Playgroud)

查询(将 12 替换为您的变量)

SELECT * FROM (select @p1:=12 p) parm, v_myView;
Run Code Online (Sandbox Code Playgroud)