2013-06-20 48 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 –