Помогите запрос составить)

Автор kak2z, 15 ноября 2013, 00:04:37

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kak2z

привет всем)) я снова с мускулом пришел))

есть две таблицы smf_topics и  smf_messages

надо:
1. из таблицы  smf_messages взять Н количество последних записей с уникальным id_topic (знаю надо использовать DISTINCT, но не получается)
2. Вместе с этим надо что бы на выходе получился массив где данные из smf_topics соотносятся с полученными данными  из smf_messages.
3. Ко всему прочему еще надо сделать исключение некоторых разделов (наверно NOT LIKE)
4. И было бы супер это сделать одним запросом)) если несколько запросов то я могу сделать - но не хочется удваивать количество дерганий базы..

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

Жека

Ты бы лучше словами описал, что хочешь на выходе получить.

А пока что такой запрос получается (исключение разделов только нужно дописать, но там сам справишься):

SELECT m.id_msgm.id_topicm.id_boardm.subjectt.num_views
FROM  
`messages`  AS m
INNER  JOIN topics 
AS t ON m.id_topic t.id_topic
GROUP  BY id_topic
ORDER  BY id_topic DESC 
LIMIT 0 
5

kak2z

#2
Цитата: Жека от 15 ноября 2013, 09:45:23
Ты бы лучше словами описал, что хочешь на выходе получить.

А пока что такой запрос получается (исключение разделов только нужно дописать, но там сам справишься):

SELECT m.id_msgm.id_topicm.id_boardm.subjectt.num_views
FROM  
`messages`  AS m
INNER  JOIN topics 
AS t ON m.id_topic t.id_topic
GROUP  BY id_topic
ORDER  BY id_topic DESC 
LIMIT 0 
5


Спасибо) буду дома доделаю и проверю)))
а словами)) хочу сделать вывод обновленных топиков. То есть топиков в которых добавилось сообщение. Сейчас есть что то вроде "Ответы на Ваши сообщения", но их не видят гости естественно... а мне надо что бы в том числе и гости могли отслеживать темы в которых появились ответы) думаю глубина просмотра увеличится. 
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Жека

Только этот запрос на большой базе, скорее всего, будет исполняться долго.

По-хорошему, нужно обрезать таблицу messages по времени, скажем, за последний день-два.

iaroslav

Цитата: kak2z от 15 ноября 2013, 12:20:02
а словами)) хочу сделать вывод обновленных топиков. То есть топиков в которых добавилось сообщение. Сейчас есть что то вроде "Ответы на Ваши сообщения", но их не видят гости естественно... а мне надо что бы в том числе и гости могли отслеживать темы в которых появились ответы) думаю глубина просмотра увеличится. 
Дык в таблице smf_topics есть last_messages (или как-то так). Посему можно, при желании, ограничиться просто запросом номеров сообщений оттуда.
А можно не делать дополнительные запросы, а делать обработку уже полученных последних сообщений, отобрав оттуда с уникальномым id топика (я у себя "последние темы" в сайдбаре так сделал).

kak2z

Цитата: iaroslav от 15 ноября 2013, 17:56:38А можно не делать дополнительные запросы, а делать обработку уже полученных последних сообщений, отобрав оттуда с уникальномым id топика (я у себя "последние темы" в сайдбаре так сделал).
а где хранятся последние сообщения?? как и откуда брать??
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

iaroslav

Хранятся они в $context['latest_posts'] везде, где выводятся последние сообщения.
Собственно в boardidex.template.php в месте вывода последних сообщений разработчиками любезно подписано как оттуда чего получать.
Цитировать
         /* Each post in latest_posts has:
               board (with an id, name, and link.), topic (the topic's id.), poster (with id, name, and link.),
               subject, short_subject (shortened with...), time, link, and href. */
Например, я у себя в боковой панельке пользуясь оной подсказкой вывожу 5 последних сообщений и последние темы с помощью вот такого вот кода.

if (!empty($settings['number_recent_posts']) && (!empty($context['latest_posts']) || !empty($context['latest_post'])))
{
/* Each post in latest_posts has:
board (with an id, name, and link.), topic (the topic's id.), poster (with id, name, and link.),
subject, short_subject (shortened with...), time, link, and href. */
$atl_i = 0;
foreach ($context['latest_posts'] as $post)
{
$atl_i++;
if ($atl_i<=5) echo '
<p><strong>', $post['link'], '</strong> ', $txt['by'], ' ', $post['poster']['link'], '<br>[
', $post['time'], ' ]</p>';
if (!isset($atl_array[$post['topic']])) $atl_array[$post['topic']] = 1;
else $atl_array[$post['topic']]++;
}
}
echo '
</div>
</div>';
echo '
<div class="windowbg">
<div class="cat_bar">
<h3 class="catbg">Последние темы.</h3>
</div>
<div class="inner"> ';
if (count($atl_i)>=1)
{
$atl_i = 0;
array_splice($atl_array, 0);
foreach ($context['latest_posts'] as $post)
{
$atl_i++;
if (!isset($atl_array[$post['topic']])) $atl_array[$post['topic']] = 1;
else $atl_array[$post['topic']]++;
if (($atl_array[$post['topic']] <= 1) and ($atl_i<=5))
echo '
<p><strong>', $post['link'], '</strong> ', $txt['by'], ' ', $post['poster']['link'], '<br>[ ', $post['time'], ' ]</p>';
}
}