|
|
|
| Запутался однако.
таблица private:
ts int(11) //time();
nick_id int(11) //айди юзера которому принадлежит ящик
from_nick_id int(11) // айди юзера который пишет
msg text utf8_general_ci
<?php
$id = $_SESSION['id'];
$limitcount = mysql_result(mysql_query("SELECT COUNT(*) FROM private WHERE nick_id = '$id'"),0) - _PRIVATE_ROWS;
if($limitcount > 0)mysql_query("DELETE FROM private WHERE nick_id = '$id' ORDER BY ts ASC LIMIT $limitcount");
$res = mysql_query("SELECT * FROM (SELECT * FROM private WHERE nick_id = '$id' OR from_nick_id = '$id' ORDER BY ts DESC) as msg ORDER BY msg.ts ASC");
php?>
|
Получается нужно выводить все последние сообщения которые получил/отправил юзверь.
Если сообщений в ящике данного юзера больше чем _PRIVATE_ROWS то удаляем ранние.
Всё вроде бы круто, но проблема заключается в том что при удалении сообщений,так же пропадают и у того кто отправил, тоесть исчезают посреди сообщений.. Запутался как нормально реализовать... | |
|
|
|
|
|
|
|
для: sl1p
(02.10.2008 в 02:31)
| | хай как дела | |
|
|
|
|
|
|
|
для: sl1p
(02.10.2008 в 02:31)
| | Пожалуй в такой постановке проблему не решить... может лучше ориентироваться на дату, а не на количество сообщений - попроще будет... или требование жесткое? | |
|
|
|
|
|
|
|
для: cheops
(03.10.2008 в 04:47)
| | да нет не жесткое)
ну единственное хотелось бы сделать чтобы юзер изменял _PRIVATE_ROWS по своему желанию.. но это в принципе не важно.
хм, а предложите тогда свой вариант с датой..
типа удалять всё что ниже сегодняшнего на столько-то? | |
|
|
|
|
|
|
|
для: sl1p
(03.10.2008 в 16:47)
| | В любом случае для разных посетителей не получится использовать разные интервалы. Если вы хотите, чтобы посетители имели возможность назначать разное количество хранимых сообщений или дату - лучше дублировать сообщения. Т.е. появляется приватное сообщение и в базу данных ложиться две записи - одна для адресата, другая для отправителя. В этом случае сообщения разных посетителей не будут зависеть друг от друга и их можно будет спокойно удалять. | |
|
|
|
|
|
|
|
для: cheops
(04.10.2008 в 00:24)
| | Хм идея в принципе интересная, но это есть чат и такого будет не мало*2..
не загнётся ли бд?)
и ещё если цепляться за ваш вариант,то как сравнить 2 таймстампа не переводя его в "понимаемую" дату...?)Тоесть как узнать между ними нужную мне разницу? | |
|
|
|
|
|
|
|
для: sl1p
(04.10.2008 в 08:54)
| | >Хм идея в принципе интересная, но это есть чат и такого будет не мало*2..
>не загнётся ли бд?)
Да не должна, иначе у вас двухкратный скачок посещаемости будет приводить к загибу :))) Обычно влияет, если увеличение объема или нагрузки возрастает на порядки, а в разы - это не страшно.
>и ещё если цепляться за ваш вариант,то как сравнить 2 таймстампа не переводя его в "понимаемую" дату...?)Тоесть как узнать между ними нужную мне разницу?
Здесь удобно воспользоваться функцией FROM_UNIXTIME(), которая переводит время из TIMESTAMP-формата в MySQL-представление. Например, следующий запрос удаляет все записи, которым больше 1 месяца
DELETE FROM private
WHERE nick_id = '$id' AND FROM_UNIXTIME(ts) < NOW() - INTERVAL 1 MONTH
|
| |
|
|
|
|
|
|
|
для: cheops
(04.10.2008 в 10:52)
| | Тогда уж лучше сосчитать границу средствами php
$range = strtotime('-1 month');
$sql = "DELETE FROM private WHERE nick_id = '$id' AND ts < $range";
|
| |
|
|
|
|
|
|
|
для: sl1p
(02.10.2008 в 02:31)
| | всем огромнейшее спасибо!:) | |
|
|
|
|
|
|
|
для: sl1p
(04.10.2008 в 12:09)
| | упс забыл спросить:)
возможно ли както добавить 2 записи одним запросом?..
делаю так:
mysql_query("INSERT INTO `private` ( `ts` , `owner_nick_id` , `whom_nick_id` , `from_nick_id` , `msg` ) VALUES('$ts','$whom_id','$whom_id','$from_id','$msg')");
mysql_query("INSERT INTO `private` ( `ts` , `owner_nick_id` , `whom_nick_id` , `from_nick_id` , `msg` ) VALUES('$ts','$from_id','$whom_id','$from_id','$msg')");
не пишет изза одинакового поля ts /primary key
.. как вылечить?) | |
|
|
|
|
|
|
|
для: sl1p
(04.10.2008 в 12:31)
| | Лучше введите сурогатный первичный ключ id (снабдив его атрибутом AUTO_INCREMENT), а ts сделайте обычным полем - иначе у вас в одно и то же время нельзя будет отправлять разные сообщения - только одно сообщение в секунду. Для добавления двух записей можно использовать многострочный INSERT
<?php
$query = "INSERT INTO `private` (`id`, `ts` , `owner_nick_id` , `whom_nick_id` , `from_nick_id` , `msg` )
VALUES(NULL, '$ts','$whom_id','$whom_id','$from_id','$msg'), (NULL, '$ts','$whom_id','$whom_id','$from_id','$msg')";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(04.10.2008 в 13:42)
| | Хм, спасибо.. я просто босюь этих авто_инкрементов ибо поле типа инт заканчивается когдато.. настораживает немного)
хух полегчало) сделал наконец) спасибо ещё раз) | |
|
|
|
|
|
|
|
для: sl1p
(04.10.2008 в 17:19)
| | >Хм, спасибо.. я просто босюь этих авто_инкрементов ибо поле типа инт заканчивается когдато.. настораживает немного)
Используйте BIGINT - его исчерпать практически нереально. Я по крайней мере ещё не разу не сталкивался с ситуацией, когда он исчерпывался. | |
|
|
|
|
|
|
|
для: cheops
(04.10.2008 в 19:22)
| | так и сделал:) будем надеяться на лучшее :D | |
|
|
|
|
|
|
|
для: cheops
(04.10.2008 в 19:22)
| | > Используйте BIGINT <...> Я по крайней мере ещё не разу не сталкивался с ситуацией, когда он исчерпывался.
А что, Вы встречались с ситуацией, когда INT не хватало? :) | |
|
|
|
|
|
|
|
для: BinLaden
(05.10.2008 в 10:41)
| | Один раз было дело... не помню что за приложение было, но была необходимость очень часто вставлять и удалять записи. Ну а вообще да, в подавляющем большинстве случаев вполне достаточно типа INT. | |
|
|
|