Помогите с составлением запроса

Статус
В этой теме нельзя размещать новые ответы.

Matinier

Постоялец
Регистрация
5 Окт 2009
Сообщения
65
Реакции
4
Здравствуйте!
Есть такая табличка:

05.10.2009 | Коля | 100
-----------------------
06.10.2009 | Коля | 200
-----------------------
07.10.2009 | Коля | 130
-----------------------
08.10.2009 | Коля | 140
-----------------------
09.10.2009 | Коля | 150
-----------------------
15.10.2009 | Коля | 500
-----------------------
12.10.2009 | Петя | 160
-----------------------
11.10.2009 | Петя | 107
-----------------------
16.10.2009 | Петя | 134
-----------------------
20.10.2009 | Петя | 200
-----------------------
21.10.2009 | Петя | 103
-----------------------
22.10.2009 | Петя | 140
-----------------------
23.10.2009 | Петя | 700

Нужно в табличке оставить по 5 последних записей (по дате) для каждого уникального юзера (Петя, Коля). Остальные записи удалить.
Помогите, пожалуйста.
 
Всегда в таблицах делайте поле уникальное поле ПРИМАРИ КЕЙ тогда такая задача будет проще. Если нет ключа предлагаю выход (для mysql).
ALTER TABLE table ADD key_column INT;
SET @npp = 0;
UPDATE wp_table SET test = (@npp:=@npp +1) ;
Предлагая выход на php
$query = "SELECT DISTINCT user FROM table"
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
$users[] =$row["user"];
}
foreach ($users as $user) {
$ids = array();
$query = "SELECT key_column FROM tabl WHERE user='".$user."' ORDER BY date DESC LIMIT 0,5";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
$ids[] =$row["key_column"];
}
$query = "DELETE FROM table WHERE user = '".$user."' AND key_column NOT IN (".implode(',',$ids).")";
mysql_query($query);
}
Можно и чистым SQL. С примари кей можно и чистым SQL я сейчас правда не соображу как для всех пользователей универсально. Но если пользователей немного можно для каждого найти id который нужно оставить и удалить всё что не ИД. Например
DELETE FROM table WHERE key_column NOT IN (
SELECT key_column FROM tabl WHERE user='Вася' ORDER BY date DESC LIMIT 0,5
UNION ALL
SELECT key_column FROM tabl WHERE user='Петя' ORDER BY date DESC
) ну и так дальше. Может кто знает как без перечисления пользователей. Кстате колонку с ключем можно потом жахнуть. Но я советую Всегда в таблицах делать ключ.
 
Через php+sql я и сам сделал. В начале выбрал уникальных пользователей, а затем через foreach удалил для каждого ненужные записи.
Мне было интересно можно ли такое сделать чистым sql-запросом.
Насчет PK в таблицах: я прекрасно понимаю, что существование первичного ключа в таблице необходимо для идентифиции определённой записи.
Однако я не имею возможности модифицировать таблицу, аналог которой я првел в своем первом посте.
Так что остановлюсь, пожалуй, на варианте php + sql.
 
Ну есть еще хранимые процедуры. Возможностей у них больше чем у просто го вопроса. Можно хранимку написать и дёргать её когда нужно. Можно в хранимки выписать в принцыпе то же что и на пыхе.
 
вообще, если 5 последних отбирать по дате, то можно удалить так:
Код:
DELETE FROM t1
USING `table` t1, `table` t2, `table` t3, `table` t4, `table` t5, `table` t6
WHERE t1.`date` < t2.`date` 
and t2.`date` < t3.`date` 
and t3.`date`< t4.`date` 
and t4.`date` < t5.`date` 
and t5.`date` < t6.`date` 
and t1.`user` = t2.`user`
and t2.`user` = t3.`user`
and t3.`user` = t4.`user`
and t4.`user` = t5.`user`
and t5.`user` = t6.`user`
:) правда выполнение будет долгим
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху