в общем суть в том, чтобы сделать систему комментариев наподобие 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
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 написал(а):
Или вот эти извращения почитай
Спустя 5 часов, 53 минуты, 8 секунд (24.06.2010 - 09:56) Hugo_O написал(а):
tomash
блин такой материал надо долго разжевывать, чтобы полностью понять все))
kirik
нашел в твоем посте в конце ссылку от Сени - на статью в хабре.
и заметил пункт Материализованный путь (Materialized Path)
мне кажется это то, что мне нужно. пойду смотреть так ли это)
блин такой материал надо долго разжевывать, чтобы полностью понять все))
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.'
как обновить поле такого вида:
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) последнего добавленного комментария был меньше, чем у предыдущего, но был больше нуля?
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
Сделай поле 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
тогда получится вот так, понимаешь
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
если комментарий просто добавляется
если комментарий - это ответ к другому комментарию, то
вот так выглядят поля 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
таблица 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
мммм...
это новый порядок, такого еще не было у меня, но немного не то
получается вот так:
2
1
1.2
1.1
Спустя 21 минута, 16 секунд (24.06.2010 - 12:59) Hugo_O написал(а):
еще одна мысль возникла, попробую..., если не получится я просто испарюсь и исчезну с этого света))
ааа, только ответьте пожалуйста на один вопрос, чтобы не мучаться лишний раз.
mysql позволяет сортировать данные по более чем 2 полям?
и все-таки сделал все)))
если вдруг кому-нибудь будет интересно или нужно - напишу!!
ааа, только ответьте пожалуйста на один вопрос, чтобы не мучаться лишний раз.
mysql позволяет сортировать данные по более чем 2 полям?
и все-таки сделал все)))
если вдруг кому-нибудь будет интересно или нужно - напишу!!
Спустя 59 минут, 2 секунды (24.06.2010 - 13:58) tomash написал(а):
Hugo_O
Цитата |
ааа, только ответьте пожалуйста на один вопрос, чтобы не мучаться лишний раз. mysql позволяет сортировать данные по более чем 2 полям? |
Да)