2016-08-17 99 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? –