Берём из базы список последних 8 топиков, в которых были ответы-проверьте !!!

Автор антигерой, 24 апреля 2007, 12:31:20

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

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

антигерой

Есть таблица в базе: smf_messages
Содержит список всех мессаг форума, ID топиков где они были и их названия, и ID самих мессаг.

Задача: выбрать 8 последних мессаг из каждого топика (без дублирования топиков - тоесть разные топики все), для этого используется конструкция: distinct ID_TOPIC

Номер последней мессаги определяется так: SELECT MAX(ID_MSG) FROM smf_messages

Сортировка и выборка именно восьми делается так: order by ID_MSG DESC LIMIT 8

Скидал вот такой запрос к базе:

select distinct ID_TOPIC from smf_messages where ID_MSG <= ( SELECT MAX(ID_MSG) FROM smf_messages ) order by ID_MSG DESC LIMIT 8;

Проверьте, правильная ли такая запись(синтаксис) ? Сам не могу пока.
ICQ: 338289 Skype: legat79


антигерой

ICQ: 338289 Skype: legat79

digger®

Цитата: антигерой от 24 апреля 2007, 15:10:50
Что именно неправильно ?
Ну ладно, синтаксис рабочий :). Хотя вложенные селекты в MySQL будут работать начиная с 4.1, вроде.
Но будет получено 8 неповторяющихся ID топиков, а требуется, как я понял, получить 8 сообщений.
Еще, например, использование SELЕCT MAX(ID_MSG) для получения ID последнего сообщения нецелесообразно, т.к. это достаточно тяжелый запрос перебирающий все строки таблицы.
SELECT ID_MSG FROM smf_messages ORDER BY ID_MSG DESC LIMIT 1
будет на порядок быстрее. Сообщения идут по порядку и последняя запись всегда имеет максимальный ID_MSG

антигерой

>>>а требуется, как я понял, получить 8 сообщений
Нет, как раз топиков. Нафиг нужно восемь горячих сообщений из одного топика ?
Надо список топиков, в которых были последние сообщения и на главную страницу сайта.

>>>использование SELЕCT MAX(ID_MSG) для получения ID последнего сообщения

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

Тоесть синтаксис рабочий, да ? Значет буду навешивать остальное и конвертор кодировки делать.

Как думаешь, в каком виде лучше формировать выходные данные ? Файл или яваскрипт с document.write("АбраКадабра"); ???
ICQ: 338289 Skype: legat79

антигерой

Ситуация с таблицами там странная, в таблице со списком топиков - нет названий топиков, они хранятся в таблице с мессагами - что в данном случае несколько нехорошо.
ICQ: 338289 Skype: legat79

digger®

Цитата: антигерой от 24 апреля 2007, 16:41:40
Как думаешь, в каком виде лучше формировать выходные данные ? Файл или яваскрипт с document.write("АбраКадабра"); ???
Смотря что и как с ними делать.

Кстати
where ID_MSG <= ( SELECT MAX(ID_MSG) FROM smf_messages )
Вообще незачем использовать.

антигерой

>>Смотря что и как с ними делать
Экспорт на страницы сайта.

>>...Вообще незачем использовать.
Почему ? Всмысле всёравно выборка будет с конца идти ? IMHO лучше перестраховаться.

>>Сообщения идут по порядку и последняя запись всегда имеет максимальный ID_MSG
Не знаю, как сдесь, а как-то перекапывая базу пользователей в PHPBB заметил, что идут НЕ ПО ПОРЯДКУ. тоесть автоинкримент работает, но новые строки добавляются на место удалённых, тоесть Назад. Или это просто мой глюк при выводе был ?
ICQ: 338289 Skype: legat79

digger®

Цитата: антигерой от 24 апреля 2007, 17:26:42
>>...Вообще незачем использовать.
Почему ? Всмысле всёравно выборка будет с конца идти ? IMHO лучше перестраховаться.
Потому что условие - "выбрать все что меньше максимального" звучит как-то стремно :)

Я бы решил задачу так
SELECT t.ID_TOPIC, m.subject FROM smf_topics t JOIN smf_messages m ON m.ID_MSG=t.ID_FIRST_MSG ORDER BY t.ID_LAST_MSG DESC LIMIT 8

антигерой

Акстати - в каких переменных находятся пароль базы, логин и т.д.

Чтобы не бить их вручную, а взять из внутренних переменных ?
ICQ: 338289 Skype: legat79

антигерой

Да, заработало. Твой вариант кстати был правильный, мой почему-то не работал.

Что странно, в базе оказывается кодировка win-1251
Получилось так:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<?
include 'Settings.php';
$db=mysql_connect($db_server, $db_user, $db_passwd); mysql_select_db($db_name, $db);
$query='SELECT t.ID_TOPIC, m.subject FROM smf_topics t JOIN smf_messages m ON m.ID_MSG=t.ID_FIRST_MSG ORDER BY t.ID_LAST_MSG DESC LIMIT 8;';
$result=mysql_query($query, $db);
while($arr=mysql_fetch_array($result))
{
echo'<br>Название Темы: '.$arr['subject'].'';

}
?>
ICQ: 338289 Skype: legat79

антигерой

Да, и твоя строка не дёргает из базы: ID_MSG

Что там добавить надо для этого ? Я в таком синтаксисе не рублю ничего. Мне бы что попроще (((-8

Дай ссылку на мануал, где почитать о таком синтаксисе запросов. Я его вообще первый раз вижу.
ICQ: 338289 Skype: legat79

digger®

Цитата: антигерой от 06 мая 2007, 22:39:17
Да, и твоя строка не дёргает из базы: ID_MSG
ID какого именно сообщения? Ты же сказал что тебе нужны топики, а не сообщения.
Цитировать
Дай ссылку на мануал, где почитать о таком синтаксисе запросов. Я его вообще первый раз вижу.
www.mysql.org