2016-08-17 100 views
1

来形容我的问题,继承人假设的情景:MySQL的 - 在多个子查询的结果,使用查询

(
    select user_id, stat 
    from stats1 
    where user_id in (select id from users where selected = 1) 
) 

union 

(
    select user_id, stat 
    from stats2 
    where user_id in (select id from users where selected = 1) 
) 
union 
(
    select user_id, stat 
    from stats3 
    where user_id in (select id from users where selected = 1) 
) 
# and so on ... 

看看如何在“在哪里”被多次使用的查询。我想保存这个查询的结果,然后使用它。在所有其他查询中。显然这很容易,如果通过在PHP中运行该查询,然后传递值,但这可能纯粹在MySQL中?

+0

我想你可以使用一些[MySQL视图](http://dev.mysql.com/doc/refman/5.7/en/view-syntax.html)。我假设引擎会在第一次请求后的请求期间使用缓存 –

+0

您可以将该查询的结果存储在mysql变量中,稍后可以引用它。 – 1000111

+0

这通常是用CTE完成的,在mysql和mysql中这些子查询都很慢。你为什么需要它? statsN不应该只是一个表而不是几个? – e4c5

回答

0

你可以为你的选择的用户

CREATE VIEW selectedUsers AS SELECT id FROM users WHERE selected = 1; 

创建永久的视图然后,当你需要它,你的语法会更容易和更轻

(
    SELECT user_id, stat 
    FROM stats1 
    WHERE user_id IN (SELECT * FROM selectedUsers) 
) 

UNION 

(
    SELECT user_id, stat 
    from stats2 
    WHERE user_id IN (SELECT * FROM selectedUsers) 
) 
UNION 
(
    SELECT user_id, stat 
    FROM stats3 
    WHERE user_id IN (SELECT * FROM selectedUsers) 
) 
# and so on ... 

如果表中的数据用户在请求期间不改变,数据库引擎应该在每次需要查看时使用缓存

这里是MySQL Views documentation

+0

不应该是user_id IN(从selectedUsers中选择*)? – e4c5

+0

@ e4c5你是对的!抱歉!谢谢 –

+0

@ Ahmed-Anas Ok for you? –