I want to combine two queries' results. I used select union but it imposed my web-site. (for the records my php memory limit is 128M) How can i combine these queries' results without imposing server?
First query
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
Second query
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
Union query
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
You are reaching memory limits because this query adds ALL rows that meet your criteria into memory and then reduces it down to 25 rows. If you reduce the rows in each component first, it should reduce the memory burden by only looking at each query half first and then returning 25 rows each so it will only take into account 50 rows.
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
Alternatively you can create temporary tables as a way of reducing the amount of computation performed in any single step...
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.