MySQL задача: да се извади предишното и следващото съобщение в дадена тема


Ето една интересна задача: имаме таблица теми и таблица съобщения във всяка тема. Въпросът е как по дадено id на тема и id на съобщение от нея, да се извади съобщението, предното съобщение в темата и следващото съобщение в темата


Постановката


Ето как изглежда базата данни, попълнена с тестови данни:

create table threads(id int, title varchar(80));
create table messages(id int, thread_id int, contents varchar(255));
insert into threads(id, title) values
(1, 'thread 1'), (2, 'thread 2'), (3, 'thread 3');
insert into messages(id, thread_id, contents) values
(1, 1, 'p1 message 1'), (2, 2, 'p2 message 1'), (3, 3, 'p3 message 1'),
(4, 3, 'p3 message 2'), (5, 1, 'p1 message 2'), (6, 2, 'p2 message 2'),
(7, 2, 'p2 message 3'), (8, 1, 'p1 message 3'), (9, 3, 'p3 message 3');


Имаме съобщение с id=5 и тема thread_id=1, и искаме да извадим интересуващите ни три съобщения.


Решение едно: 2 + 1 заявки


Да разгледаме следния фрагмент код:

$id = 5;
$thread_id = 1;

$res_prev = mysql_query("select max(id) as prev_id from messages where thread_id=$thread_id and id<$id");
$row_prev = mysql_fetch_assoc($res_prev);
$id_prev = $row_prev['prev_id'];

$res_next = mysql_query("select min(id) as next_id from messages where thread_id=$thread_id and id>$id");
$row_next = mysql_fetch_assoc($res_next);
$id_next = $row_prev['next_id'];

$res_all = mysql_query("select * from messages where id in ($id, $id_prev, $id_next) order by id asc");


Тук просто първоначално намираме интересуващите ни предишно и следващо съобщение с две допълнителни заявки, и накрая вадим трите съобщения по id с трета заявка.


Решение две: една заявка


Да разгледаме следния метод: намираме id на съобщението преди нашето в темата. От него взимаме следващите 3 съобщения включително. Тогава имаме предишното, текущото и следващото само в една заявка:

$res_all = mysql_query("select * from messages
where id>ifnull((select max(id) from messages WHERE id<'$id' AND thread_id='$thread_id'), 0) and thread_id='$thread_id'
order by id asc
limit 3");

Няма коментари

Обратно към списъка със статиите

Тази страница последно е променяна на 2024-04-26 14:53:06