Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL - сдвиг строк

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Maverik2210

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
привет.
осваиваю только мускуль.  
 
задача -имеется база данных, в которой по достижении определенного количества записей (строк) должа стираться самая старая строка и вся база соотвественно сдвигается на одну единицу, и так при каждой новой записи, т.е. количество строк остается неизменным,  просто идет свдиг "первым пришел- последним ушел".  
 
средствами php + mysql

Всего записей: 28 | Зарегистр. 25-08-2005 | Отправлено: 23:17 21-08-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maverik2210
какой смысл? что мешает просто выбирать последние N записей, а иногда "подтирать" старое?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:21 21-08-2013 | Исправлено: Cheery, 23:21 21-08-2013
fx54321

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Удаление
 
DELETE FROM  `таблица` ORDER BY `дата создания` LIMIT 1
 
поле с датой создания должно быть в таблице или можно использовать id
 
Вставка через insert, это просто

Всего записей: 9 | Зарегистр. 12-09-2010 | Отправлено: 23:25 21-08-2013
Maverik2210

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery спасибо, как раз был уверен что есть простое решение.  
fx54321 тоже спасибо.  primary key использовать нехоцца, чтобы не получить бесконечно возрастающую величину.  а стирать самую старую строку вполне можно, есть соответствующее поле.  
правда в этом случае нужно сначала найти поле с самой старой записью а это какой-то перебор.
вроде как пхп-шные функции по логике после соединения с базой должны обращаться к базе начиная с самой старой записи.
 
думал как-то так. коннкетимся к базе, затем
mysql_num_rows  -получаем количество записей.
 
затем обращаемся к базе  mysql_fetch_row - вроде как получаем как раз самую старую запись. вот тут бы, имея на нее указатель, ее и стереть (как ?), а потом новую дописать в конец базы.
 
 
кстати, попутно вопрос про timestamp. есть одно поле в этом формате, но средствами пхп не удалось его вывести в виде числа (unix timestamp) - упорно выводит в виде даты. пришлось записывать время в поле вида BIG INTEGER - и всё заработало. но это лишние восемь байт.
 

Всего записей: 28 | Зарегистр. 25-08-2005 | Отправлено: 23:57 21-08-2013 | Исправлено: Maverik2210, 00:02 22-08-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maverik2210

Цитата:
упорно выводит в виде даты.

потому что оно там уже хранится в виде даты
 
хотите цифру, то SELECT UNIX_TIMESTAMP(столбец)
или преобразуйте в php с помощью strtotime
 

Цитата:
mysql_num_rows  -получаем количество записей.  

зачем лишние действия/запросы?  
выбираете последние N запросов
SELECT * FROM table ORDER by столбец, идентифирующий_последовательность DESC LIMIT N
 
и иногда (в зависимости от скорости "наполнения" таблицы) делаете, например, так
DELETE FROM table WHERE id NOT IN (SELECT id FROM table ORDER by столбец, идентифирующий_последовательность DESC LIMIT N)

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:05 22-08-2013 | Исправлено: Cheery, 00:08 22-08-2013
Maverik2210

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery спасибо!

Всего записей: 28 | Зарегистр. 25-08-2005 | Отправлено: 00:22 22-08-2013
Maverik2210

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
чтобы не задействовать id пришлось всё-же использовать mysql_num_rows.  
получилось как-то так:
 
$current_dots= mysql_num_rows($result);
$query1 = "SELECT * FROM sensor_data ORDER BY date_time, DESC LIMIT "."$MAX_DOTS"."";  
mysql_query ($query1);  
if ($current_dots > $MAX_DOTS )    
    {     $current_diff = $current_dots - $MAX_DOTS;  
           $query2 = "DELETE FROM sensor_data ORDER BY date_time LIMIT "."$current_diff"."";  
           mysql_query ($query2);             
    }

Всего записей: 28 | Зарегистр. 25-08-2005 | Отправлено: 10:23 25-08-2013 | Исправлено: Maverik2210, 10:24 25-08-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maverik2210
не понимаю зачем столько кода, если решается в один запрос?
чем вам через id не нравится?
 
Ну хорошо, вот другой вариант
 
DELETE FROM sensor_data WHERE date_time < (SELECT Min(t.date_time) FROM (SELECT date_time FROM sensor_data ORDER BY date_time DESC LIMIT количество) t)

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 10:58 25-08-2013
Maverik2210

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а что такое t ?

Всего записей: 28 | Зарегистр. 25-08-2005 | Отправлено: 12:24 25-08-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maverik2210

Цитата:
а что такое t  

алиас для результатов
Цитата:
SELECT date_time FROM sensor_data ORDER BY date_time DESC LIMIT количество



----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:47 25-08-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL - сдвиг строк


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru