[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: иерархия комментариев
Hugo_O
сложна оказалась для меня эта задача, третий день мозг убиваю и до конца не могу сделать!
в общем суть в том, чтобы сделать систему комментариев наподобие habrahabr.
что сделал я:
к таблице с комментариями добавил 3 поля
1 поле - айди группы комментариев, то есть если первый комментарий имеет айди 1, то все вложенные в него тоже имеют 1.
2 поле - позиция вложенного комментария относительно главного. у главного 0, у первого вложенного 1, и.т.д и так до 8
3 поле - если существуют два комментария одного уровня в одной группе, то у нового тут прибавляем 1, чтобы отличать их. а у родителя изначально стоит 0 ,то есть в итоге допустим может быть такая таблица с этими полями:
п1 п2 п3
1 0 0 -первый коммент
1 1 0 -коммент, вложен в первый, так как позиция у него 1 а группа одна и таже
1 2 0 - коммент, вложен в предыдущий
2 0 0 - второй коммент
2 1 0 - вложен во второй
2 1 1 - тоже вложен, во второй, но чтобы их отличить в 3 поле добавляем +1
2 1 2 - тоже самое
2 2 0 - это коммент который вложен в 2 1 0
2 3 0 - вложен в этот 2 2 0
2 2 1 - коммент вложен в 2 1 1

со составлением такой таблицы проблем нет, проблема в другом, необходимо придумать формулу, как-то свзязать эти значения полей, чтобы в итоге получился логический порядок между комментариями, предыдущая таблица например должна выглядеть в таком порядке на выходе:
2 0 0
2 1 0
2 2 0
2 3 0
2 1 1
2 2 1
2 1 2
1 0 0
1 1 0
1 2 0

я понимаю, что сложно во все это вникунуть, если у кого-то есть идеи как лучше ИНАЧЕ добиться цели, с радостью выслушаю. Но пока все, что бы я не пробовал, где-то да порядок нарушается(((



Спустя 1 час, 54 минуты, 35 секунд (23.06.2010 - 22:43) tomash написал(а):
Все намного проще. Сделай поле parentid и ты точно будешь знать к какому комментарию относится текущий. Уровень вложенности бесконечный.

Спустя 22 минуты, 30 секунд (23.06.2010 - 23:06) Hugo_O написал(а):
tomash
можно поподробнее?
что из существующих полей лишнее?

дело в том, что мало того, чтобы знать кто к кому относится, отображать еще их нужно правильно

Спустя 22 минуты, 24 секунды (23.06.2010 - 23:28) tomash написал(а):
Смотрите! Я предлагаю сделать поля id и parentid. Т.е. вы не смотрите какой комент на каком уровне вложености и т.д. Например

id parentid
1 0 - первый
2 0 - второй
3 1 - вложеный в первый
4 3 - вложеный в третий, а тот в первый
5 1 и т.д
6 2
7 4



Спустя 2 минуты, 37 секунд (23.06.2010 - 23:31) Hugo_O написал(а):
tomash
ладно, завтра покапаюсь с таким вариантом, спс, если что напишу!!!

Спустя 2 минуты, 38 секунд (23.06.2010 - 23:34) tomash написал(а):
Для реализации более сложных иерархий NESTED SETS

Спустя 4 часа, 29 минут, 13 секунд (24.06.2010 - 04:03) kirik написал(а):
Или вот эти извращения почитай smile.gif

Спустя 5 часов, 53 минуты, 8 секунд (24.06.2010 - 09:56) Hugo_O написал(а):
tomash
блин такой материал надо долго разжевывать, чтобы полностью понять все))
kirik
нашел в твоем посте в конце ссылку от Сени - на статью в хабре.
и заметил пункт Материализованный путь (Materialized Path)
мне кажется это то, что мне нужно. пойду смотреть так ли это)

Спустя 36 минут, 5 секунд (24.06.2010 - 10:32) Hugo_O написал(а):
kirik
все просто шикарно, огромное спасибо!!!

Спустя 14 минут, 55 секунд (24.06.2010 - 10:47) Hugo_O написал(а):
блин только один глупый вопрос не по теме:
как обновить поле такого вида:
SET posid=id+'.'

короче говоря если поле id='1', то posid должно стать '1.'

Спустя 3 минуты, 20 секунд (24.06.2010 - 10:50) waldicom написал(а):
CONCAT(id, ".")

Спустя 1 минута, 42 секунды (24.06.2010 - 10:52) Hugo_O написал(а):
waldicom
спасибо!! то что надо!

Спустя 3 минуты, 56 секунд (24.06.2010 - 10:56) SlavaFr написал(а):
вариант с nested sets не по всей таблице, а только для веток одного вопрса я считаю давольно приемлимым и перформантным.

Спустя 28 минут, 3 секунды (24.06.2010 - 11:24) tomash написал(а):
Цитата (Hugo_O @ 24.06.2010 - 06:56)
блин такой материал надо долго разжевывать, чтобы полностью понять все))


Там есть место для маневра )))) Можно упростить в зависимости от задачи

Спустя 10 секунд (24.06.2010 - 11:24) Hugo_O написал(а):
блиииннн!!! вот всегда так, иерархию я построил
1
-1.1
--1.1.1
-1.2
2
-2.1

ит.д вроде все хорошо!!!!
кроме того, что новый коммент попадает под старый, то есть отображаться будут сначала старые комментарии, как это исправить блин.... буду думать сейчас

тут два варианта:
-либо искать другой вид иерархии, который лучше подойдет
-либо в поле posid начинать не с 1, а скажем 1000000-1, или что-то типа того

как еще можно добиться того, чтобы posid комментария нулегого уровня(пока, что он просто равен id) последнего добавленного комментария был меньше, чем у предыдущего, но был больше нуля?

Спустя 15 минут, 20 секунд (24.06.2010 - 11:40) tomash написал(а):
Hugo_O
Сделай поле date и сортируй по дате! Либо ORDER BY posid DESC

Спустя 4 минуты, 59 секунд (24.06.2010 - 11:44) Hugo_O написал(а):
tomash
тогда получится вот так, понимаешь
2.2
2.1
2
1.2
1.1
1

вложенные комментарии получаются выше тех, в которые они вложены o_O

Спустя 10 минут, 37 секунд (24.06.2010 - 11:55) Hugo_O написал(а):
tomash
кажется я начинаю понимать о чем ты, сейчас попробую все-таки сделать, то что ты с самого начала посоветовал

Спустя 3 минуты, 48 секунд (24.06.2010 - 11:59) tomash написал(а):
Hugo_O
Какая структура таблицы и как Вы делаете запрос?

Спустя 16 минут, 10 секунд (24.06.2010 - 12:15) Hugo_O написал(а):
tomash

таблица mess
id userid songid message uwmessage date posid pos

если комментарий просто добавляется

$addmessage= mysql_query ("INSERT INTO mess (userid, songid, message, uwmessage, date) VALUES 
('
$_SESSION[id]', '$songid', '$message_mysql', '$uwmessage_mysql', UTC_TIMESTAMP())");

$updmessagepos=mysql_query("UPDATE mess SET posid=CONCAT(id, '.') WHERE id=last_insert_id()");/////


если комментарий - это ответ к другому комментарию, то
$findposresult=mysql_query("SELECT posid, pos  FROM mess WHERE id='$messid'");
$findpos=mysql_fetch_assoc ($findposresult);
if($findpos['pos']<8)
{
$posid=$findpos['posid'];
$newposid=$posid."1.";
$newpos=$findpos['pos']+1;

$findposclassresult=mysql_query("SELECT posid, id FROM mess WHERE posid LIKE '$newposid'
ORDER BY id DESC LIMIT 1"
);
$findposclass=mysql_fetch_assoc ($findposclassresult);
//если подпункт уже есть, то меняем ему posid
if (count($findposclass)>1)
{
$lastposk=preg_match("/((\.+)(\d)(\.+))$/i", $newposid, $lastposka);
$lastposk=$lastposka[3];
$k=$lastposk+1;
$newposid=$posid.$k.".";
}
}



$addmessage= mysql_query ("INSERT INTO mess (userid, songid, message, uwmessage, date, posid, pos)
VALUES ('
$_SESSION[id]', '$songid', '$message_mysql', '$uwmessage_mysql', UTC_TIMESTAMP(), '$parid', '$newposid', '$newpos')");


вот так выглядят поля posid и pos в таблице:
posid ______pos
1.__________0
1.1._________1
1.2._________1
1.2.1._______2
1.2.1.1._____ 3
1.2.2._______2
1.2.1.2.______3

Спустя 17 минут, 40 секунд (24.06.2010 - 12:33) tomash написал(а):
Вы когда их добавляете в базу уже определяете их порядок. Значит если ORDER BY pos ASC, posid DESC то нарушиться порядок?

Спустя 5 минут, 19 секунд (24.06.2010 - 12:38) Hugo_O написал(а):
tomash
мммм...
это новый порядок, такого еще не было у меня, но немного не то
получается вот так:
2
1
1.2
1.1

Спустя 21 минута, 16 секунд (24.06.2010 - 12:59) Hugo_O написал(а):
еще одна мысль возникла, попробую..., если не получится я просто испарюсь и исчезну с этого света))

ааа, только ответьте пожалуйста на один вопрос, чтобы не мучаться лишний раз.
mysql позволяет сортировать данные по более чем 2 полям?

и все-таки сделал все)))
если вдруг кому-нибудь будет интересно или нужно - напишу!!

Спустя 59 минут, 2 секунды (24.06.2010 - 13:58) tomash написал(а):
Hugo_O
Цитата
ааа, только ответьте пожалуйста на один вопрос, чтобы не мучаться лишний раз.
mysql позволяет сортировать данные по более чем 2 полям?


Да)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.