Форумы 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 как по другому сделать даже не предполагаю кому несложно помогите пожалуйста.

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

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;
20.09.2013 13:32:39 #
Mozilla Firefox victor
Всем привет!
Вот у меня тоже вопрос. Есть таблица с такими полями
Номер Фамилия Имя Телефон Дата_рождения Отдел Должность
 
Нужно создать view с такими данными
Номер месяца рождения
Количество сотрудников, у которых ДР в текущем месяце
 
Вопрос как вытащить месяц из даты. create view ... as select
А вот как выбрать месяца? Ведь по ним ещё потом и сотрудников выбирать.
Каков код?
20.09.2013 18:10:08 #
Mozilla Firefox dima
Дата_рождения имеет тип DATE, DATE_TIME или TIMESTAMP? Тогда:
 
SQL
MONTH(Дата_рождения) AS birth_month
22.09.2013 00:23:20 #
Mozilla Firefox victor
Тип DATE
Чего-то не получается - вся дата выбирается. Или я не так чего пишу. Не получается.I am malicious
22.09.2013 09:05:57 #
Mozilla Firefox dima
Запрос
SQL
SELECT MONTH('2013-09-22') AS birth_month
выдает: birth_month -> 9
 
Видимо, Вы что-то не так делаете. Приведите запрос целиком.
22.09.2013 15:26:22 #
Mozilla Firefox victor
Ещё попробую, напишу потом.

Ответить:

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

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

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

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