Хорошо, моя дилемма такова. У меня есть страница администратора, которую я использую, чтобы получить сводку материалов дня на одном из моих сайтов. Эта страница sumamry извлекает данные из нескольких таблиц, некоторые из которых хранят фактические данные мультимедиа, другие хранят URL-адреса, идентификаторы и владельцы веб-сайта, а другая таблица хранит ежедневную статистику для расчета коэффициентов ввода/вывода для каждого домена.Возможно ли слияние этих (длинных) запросов mysql?
Эта страница админ имеет основной запрос, который вытягивает фактические данные СМИ, который выглядит следующим образом (упрощенный):
SELECT
content.con_catid,
content.con_posttime,
content.con_url,
content.con_id,
content.con_title,
categories.name,
users.username,
users.user_id,
FROM content
LEFT JOIN categories
ON (content.con_catid = categories.id)
LEFT JOIN users
ON (content.con_poster = users.user_id)
WHERE con_status = 0 ORDER BY con_posttime
довольно прямо вперед. Тогда, это - то, где это становится беспорядочным. Для каждого времени петель заявления mysql_fetch_array (для вывода каждого элемента контента), я также запустить эти 2 запросов:
SELECT count(con_id) as pending FROM content WHERE con_poster = '$this_userid' AND con_status = 0
SELECT count(con_id) as approved FROM content WHERE con_poster = '$this_userid' AND con_status = 2
Они получают количество ожидающего, и одобрил элементы для каждого пользователя, которому принадлежит представлению (которое перечислен рядом с каждым представлением.
И тогда есть убийца, который добавляет много времени, чтобы время выполнения страницы, так как он также должен быть повторен для каждой строки исходного запроса.
SELECT website_url,
website_id,
website_shady,
COALESCE(sum(dstats_hits),0)+website_in_ballast as total_in,
COALESCE(sum(dstats_hits_out),0)+website_out_ballast as total_out,
sum(dstats_hits_out_paid) as total_paid,
website_in_ballast,
website_out_ballast
FROM websites
LEFT JOIN domain_stats ON (websites.website_id = domain_stats.dstats_domid)
WHERE website_id IN (SELECT website_id FROM websites WHERE website_userid = $this_userid)
GROUP BY website_url
Есть ли способ, которым я могу объединить последние 3 запроса int he first one? Потому что теперь .... если у меня есть 100 элементов в очереди, то это 301 запрос (401, если вы включаете подзапрос), которые занимают некоторое время, чтобы сгенерировать страницу.
Вопрос: есть ли причина для подзапроса в последнем запросе? Не могли бы вы просто написать «WHERE website_userid = $ this_userid»? – 2008-12-03 10:10:25