За последние 24 часа нас посетили 19449 программистов и 1632 робота. Сейчас ищут 1819 программистов ...

Удаление старых записей из mysql

Тема в разделе "Сделайте за меня", создана пользователем domio, 30 янв 2017.

  1. domio

    domio Активный пользователь

    С нами с:
    18 дек 2012
    Сообщения:
    35
    Симпатии:
    5
    Приветствую Вас!
    Есть таблица mysql в таком виде. Мне нужно при нажатии на кнопку "update" удалять из этой таблицы самые старые записи, с одинаковой временной меткой( в данном случае это будет первые два рядка). Количество рядков с одинаковой временной меткой может увеличиваться ну и соответственно надо удалить уже больше рядков.
    HTML:
    1. <table border="1"><tr>
    2.             <td>10.11.34.2</td>
    3.             <td>10.11.34.39 - 26</td>
    4.             <td>1485767824</td>
    5.         </tr><tr>
    6.             <td>10.11.34.2</td>
    7.             <td>10.11.34.45 - 25</td>
    8.             <td>1485767824</td>
    9.         </tr><tr>
    10.             <td>10.11.34.2</td>
    11.             <td>10.11.34.39 - 26</td>
    12.             <td>1485768846</td>
    13.         </tr><tr>
    14.             <td>10.11.34.2</td>
    15.             <td>10.11.34.45 - 25</td>
    16.             <td>1485768846</td>
    17.         </tr><tr>
    18.             <td>10.11.34.2</td>
    19.             <td>10.11.34.39 - 26</td>
    20.             <td>1485769040</td>
    21.         </tr><tr>
    22.             <td>10.11.34.2</td>
    23.             <td>10.11.34.45 - 25</td>
    24.             <td>1485769040</td>
    25.         </tr></table>
    Я набросал небольшой код, который работает, но выглядит он убого. Хотелось бы не изобретать велосипед, возможно подскажете какой-то другой способ выполнения данной операции.
    PHP:
    1.     echo "Updating...";
    2.     $sql = "SELECT * FROM lldp WHERE ip_address='$ip_address'";
    3.     $result = $link->query($sql);
    4.     if ($result->num_rows > 0) {
    5.         while($row = $result->fetch_assoc()) {
    6.             $timestamp[] = $row['date'];
    7.         }
    8.     }
    9.     $tempArray = array_count_values($timestamp);
    10.     foreach ($tempArray as $key => $value) {
    11.         $sql = "DELETE FROM lldp WHERE ip_address='$ip_address' AND date='$key'";
    12.         if ($link->query($sql) === TRUE) {
    13.             echo "Record deleted successfully \n";
    14.         } else {
    15.             echo "Error: " . $sql . "<br>" . $conn->error;
    16.         }
    17.         break;
    18.     }
    19.     }    
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Значит всё нормально.
    Только добавь защиты от sql-injection, xss и т. д.
    http://phpfaq.ru/tech/safety
     
  3. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Ваша задача решается одним единственным запросом DELETE + JOIN c GROUP BY и HAVING.
     
  4. domio

    domio Активный пользователь

    С нами с:
    18 дек 2012
    Сообщения:
    35
    Симпатии:
    5
    Я ведь и создал тему в разделе "сделайте за меня".;)
    Проблема заключается в том, что временная метка будет всегда разная.
    PHP:
    1.     $sql = "SELECT date FROM lldp WHERE ip_address='$ip_address' ORDER BY date LIMIT 0,1";
    2.     $result = $link->query($sql);
    3.     if ($result->num_rows > 0) {
    4.         $row = $result->fetch_row();
    5.         $timestamp = $row[0];
    6.     }
    7.     // print_r($timestamp);
    8.     //2 - вариант
    9.     $sql = "DELETE FROM lldp WHERE ip_address='$ip_address' AND date='$timestamp'";
    10.     if ($link->query($sql) === TRUE) {
    11.         echo "Records deleted successfully <br>";
    12.     } else {
    13.         echo "Error: " . $sql . "<br>" . $link->error;
    14.     }
    На данный момент сократил код до такого формата, если подскажете как удалить то что мне нужно в одну строчку, буду премного благодарен.