2013-06-20 4 views
0

Я хочу совместить результаты двух запросов. Я использовал select union, но он наложил мой веб-сайт. (для записей мой лимит памяти php равен 128 М). Как я могу объединить результаты этих запросов без наложения сервера?Как я могу объединить результаты этих запросов 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

Ммм, но он сказал, что на веб-сервере заканчивается ОЗУ. Вы полагаете, что он работает с БД и веб-сервером на том же хосте? –

+0

Наверное - я основывал свое предположение на том, что это для форума и моей широкой убежденности в том, что большинство форумов php запускаются на многоцелевых, недорешенных, небольших серверах. –

+0

Спасибо за ваше предложение уменьшить нагрузку на сервер 0.26 с 18.7 –

Смежные вопросы