Форумы xBB

Форумы xBB > Вебразработка

Вопрос по MySQL и SQL

Автор: Nutty. Последнее редактирование: 2011-05-23 10:49:30

Возможно сделать запрос такова типа.
У нас есть таблицы forums, forum_threads, forum_posts, и users.
суть нужно сделать запрос в таблицу forums с выборкой ячеек forum_id, forum_access далее выбрать из таблицы forum_threads ячейки thread_id, thread_subject, thread_lastuser, thread_lastpost где forum_id равен forum_id из таблицы forums c сортировкой thread_lastpost по DESC и лимитом 1
далее выбрать из таблицы forum_posts выбрать ячейку post_id где thread_id равен thread_id из таблицы forum_threads и сортировкой post_datestamp по DESC с так же с лимитом 1
и из таблицы users выбрать ячейку user_name где user_id равен thread_lastuser из таблицы forum_threads
При этом всём общий лимит должен быть 10.
 
Суть чтобы из базы MySQL получить массив такой структуры
PHP

array(
   0 =>array(
     'forum_id'=>'ID форума',
     'forum_access'=>'Кому виден форум',
     'thread_id'=>'ID последней обновлённой темы',
     'thread_subject'=>'Название темы',
     'thread_lastuser'=>'посл. раз кто изменил тему',
     'thread_lastpost'=>'время мзменения',
     'post_id'=>'Ид последнего поста',
     'user_name'=>'Имя пользователя последнего поста')
и ит до 9.
)
 
К оператору JOIN не нашел способов приделать оператор LIMIT Not so как по другому сделать даже не предполагаю кому несложно помогите пожалуйста.

5 комментариев

23.05.2011 10:02:31 #
Mozilla Firefox dima
1. Когда дело касается MySQL, вместо одного сложного запроса лучше написать несколько простых.
 
2. Чем не устраивает следующий запрос?
 
SQL
SELECT f.forum_id,
       f.forum_access,
       t.thread_id,
       t.thread_subject,
       t.thread_lastuser,
       t.thread_lastpost,
       p.post_id,
       u.user_name
FROM forums AS f
INNER JOIN forum_threads AS t ON t.forum_id = f.forum_id
INNER JOIN forum_posts AS p ON p.thread_id = t.thread_id
INNER JOIN users AS u ON u.user_id = t.thread_lastuser
ORDER BY t.thread_lastpost DESC, p.post_datestamp DESC
LIMIT 10;
23.05.2011 13:32:26 #
Opera Nutty
dima, Спасибо за ответ, Но проблема заключается в том что данный запрос из таблицы forum_threads выберет сразу 10 строк а мне нужно по одной те чтобы в массиве оказались тока самые последние обновлённые темы а при таком запросе получается 1 тема во все 10 строк.
 
dima
Когда дело касается MySQL, вместо одного сложного запроса лучше написать несколько простых.
Я это понимаю но когда эти несколько запросов превращаются в 30 это как то многовато.
23.05.2011 14:30:39 #
Mozilla Firefox dima
Тогда придется использовать вложенные подзапросы. Как-то так:
 
SQL
SELECT f.forum_id,
       f.forum_access,
       f.thread_id,
       f.thread_subject,
       f.thread_lastuser,
       f.thread_lastpost,
       p.post_id,
       u.user_name
FROM forum_posts AS p
INNER JOIN (SELECT forum_id,
                   forum_access,
                   thread_id,
                   thread_lastuser,
                   thread_lastpost
            FROM forums
            INNER JOIN forum_threads ON forum_threads.forum_id = forums.forum_id
            ORDER BY thread_lastpost DESC
            LIMIT 1
        ) AS f ON f.thread_id = p.thread_id
INNER JOIN users AS u ON u.user_id = f.thread_lastuser
ORDER BY p.post_datestamp DESC
LIMIT 10;

Запрос этот не проверял и не уверен, что он будет возвращать то, что нужно. Объясни лучше, для каких целей он нужен.
24.05.2011 08:29:52 #
Opera Nutty
dima, запрос тоже самое что и первый видимо не судьба прижиться блоку на форуме последние обновлённые темы.
24.05.2011 09:12:53 #
Mozilla Firefox dima
А так (сгруппируем по темам):
 
SQL
SELECT f.forum_id,
       f.forum_access,
       t.thread_id,
       t.thread_subject,
       t.thread_lastuser,
       t.thread_lastpost,
       p.post_id,
       u.user_name
FROM forums AS f
INNER JOIN forum_threads AS t ON t.forum_id = f.forum_id
INNER JOIN forum_posts AS p ON p.thread_id = t.thread_id
INNER JOIN users AS u ON u.user_id = t.thread_lastuser
GROUP BY t.thread_id
ORDER BY t.thread_lastpost DESC, p.post_datestamp DESC
LIMIT 10;

Ответить:

Представиться как     Антибот:
   

Просьба не постить мусор. Пользуйтесь кнопкой предварительного просмотра на панели инструментов редактора.

Введите логин: и пароль: (

© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.