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

Тема в разделе "Базы данных", создана пользователем Matinier, 7 окт 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Matinier

    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 последних записей (по дате) для каждого уникального юзера (Петя, Коля). Остальные записи удалить.
    Помогите, пожалуйста.
     
  2. Otis22

    Otis22 Создатель

    Регистр.:
    13 фев 2009
    Сообщения:
    30
    Симпатии:
    9
    Всегда в таблицах делайте поле уникальное поле ПРИМАРИ КЕЙ тогда такая задача будет проще. Если нет ключа предлагаю выход (для 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
    ) ну и так дальше. Может кто знает как без перечисления пользователей. Кстате колонку с ключем можно потом жахнуть. Но я советую Всегда в таблицах делать ключ.
     
  3. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Через php+sql я и сам сделал. В начале выбрал уникальных пользователей, а затем через foreach удалил для каждого ненужные записи.
    Мне было интересно можно ли такое сделать чистым sql-запросом.
    Насчет PK в таблицах: я прекрасно понимаю, что существование первичного ключа в таблице необходимо для идентифиции определённой записи.
    Однако я не имею возможности модифицировать таблицу, аналог которой я првел в своем первом посте.
    Так что остановлюсь, пожалуй, на варианте php + sql.
     
  4. Otis22

    Otis22 Создатель

    Регистр.:
    13 фев 2009
    Сообщения:
    30
    Симпатии:
    9
    Ну есть еще хранимые процедуры. Возможностей у них больше чем у просто го вопроса. Можно хранимку написать и дёргать её когда нужно. Можно в хранимки выписать в принцыпе то же что и на пыхе.
     
  5. Funaki

    Funaki

    Регистр.:
    26 июн 2008
    Сообщения:
    151
    Симпатии:
    16
    вообще, если 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`
    
    :) правда выполнение будет долгим
     
Статус темы:
Закрыта.