2013-06-20 44 views
0

我想結合兩個查詢的結果。我使用了select union,但是它強加了我的網站。 (對於記錄我的php內存限制是128M)我怎樣才能結合這些查詢的結果而不強加服務器?我如何結合這些sql查詢的結果?

首先查詢

SELECT mybb_posts.pid, mybb_posts.dateline, mybb_posts.subject, mybb_users.username, mybb_users.avatar, mybb_posts.message 
FROM mybb_posts, mybb_users 
WHERE mybb_posts.uid = mybb_users.uid AND mybb_posts.fid <> 170 AND mybb_posts.fid <> 77 AND mybb_posts.fid <> 96 
ORDER BY mybb_posts.dateline DESC 

第二個查詢

SELECT ek_yorumlar.id, ek_yorumlar.zaman, ek_yorumlar.icisim, mybb_users.username, mybb_users.avatar, ek_yorumlar.turu 
FROM ek_yorumlar, mybb_users 
WHERE ek_yorumlar.gonderen = mybb_users.uid 
ORDER BY ek_yorumlar.zaman DESC 

聯合查詢

SELECT * FROM( 
SELECT mybb_posts.pid, mybb_posts.dateline, mybb_posts.subject, mybb_users.username, mybb_users.avatar, mybb_posts.message 
FROM mybb_posts, mybb_users 
WHERE mybb_posts.uid = mybb_users.uid AND mybb_posts.fid <> 170 AND mybb_posts.fid <> 77 AND mybb_posts.fid <> 96 
ORDER BY mybb_posts.dateline DESC 
) AS T 
UNION ALL 
SELECT * FROM ( 
SELECT ek_yorumlar.id, ek_yorumlar.zaman, ek_yorumlar.icisim, mybb_users.username, mybb_users.avatar, ek_yorumlar.turu 
FROM ek_yorumlar, mybb_users 
WHERE ek_yorumlar.gonderen = mybb_users.uid 
ORDER BY ek_yorumlar.zaman DESC 
) AS T 
ORDER BY dateline DESC LIMIT 25 
+1

如果你的內存限制從結合查詢阻止,那麼你會必須一次運行一個並分別輸出結果。 –

回答

0

,因爲查詢增加了符合條件的到內存中,然後將所有的行,您已經達到內存限制將其降低到25行。如果首先減少每個組件中的行,則應該先減少每個查詢一半,然後每個返回25行,這樣只會考慮50行,從而減少內存負擔。

SELECT * FROM( 
SELECT mybb_posts.pid, mybb_posts.dateline, mybb_posts.subject, mybb_users.username, mybb_users.avatar, mybb_posts.message 
FROM mybb_posts 
inner join mybb_users on mybb_posts.uid = mybb_users.uid 
WHERE mybb_posts.fid not in (170 ,77 ,96) 
ORDER BY mybb_posts.dateline DESC LIMIT 25 
) AS T 
UNION 
SELECT * FROM ( 
SELECT ek_yorumlar.id, ek_yorumlar.zaman, ek_yorumlar.icisim, mybb_users.username, mybb_users.avatar, ek_yorumlar.turu 
FROM ek_yorumlar 
inner join mybb_users on ek_yorumlar.gonderen = mybb_users.uid 
ORDER BY ek_yorumlar.zaman DESC LIMIT 25 
) AS T 
ORDER BY dateline DESC LIMIT 25 

另外,您可以創建臨時表的減少了任何單一的步驟進行的計算量的一種方式......

create temporary table firsthalf 
SELECT mybb_posts.pid, mybb_posts.dateline, mybb_posts.subject, mybb_users.username, mybb_users.avatar, mybb_posts.message 
    FROM mybb_posts 
    inner join mybb_users on mybb_posts.uid = mybb_users.uid 
    WHERE mybb_posts.fid not in (170 ,77 ,96) 
    ORDER BY mybb_posts.dateline DESC LIMIT 25; 
create temporary table secondhalf 
    SELECT ek_yorumlar.id, ek_yorumlar.zaman, ek_yorumlar.icisim, mybb_users.username, mybb_users.avatar, ek_yorumlar.turu 
    FROM ek_yorumlar 
    inner join mybb_users on ek_yorumlar.gonderen = mybb_users.uid 
    ORDER BY ek_yorumlar.zaman DESC LIMIT 25; 

select * from firsthalf 
union all 
select * from secondhalf 
ORDER BY dateline DESC LIMIT 25 
+0

嗯,但他說網絡服務器內存不足。你是否認爲他在同一臺主機上運行數據庫和Web服務器? –

+0

很可能 - 我基於我的假設,它是針對論壇的,而我一直認爲大多數php論壇都運行在多用途,資源不足的小型服務器上。 –

+0

首先感謝您的建議,從18.7 –