Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kasowanie nadmiaru danych
Forum PHP.pl > Forum > Bazy danych
Spirit86
Mam problem, chcę skasować nadmair wpisów do bazy danych.

Na początku wypisuję wszystkie rekordy za pomocą pętli. Zliczam je. Po czym chcę skasować nadmiar, wykonuje polecenie

  1. DELETE
  2. FROM `tabela` WHERE costam='costaminnego' ORDER BY `date` ASC LIMIT 1*

* - Limit: 1 wziął się z LiczbaRekordów - MaksymalnaLiczbaRekordów, wcześniej założyłem, że ta liczba jest dodatnia.
Zapytanie jest poprawne, do tego momentu:

  1. DELETE
  2. FROM `tabela` WHERE costam='costaminnego' LIMIT 1


Nie mogę dodać ważnego wpisu:
  1. ORDER BY `date`
zbig13
No bo ORDER BY jest tylko do zapytania SELECT, bo przecież sortowanie przydaje się głównie przy wyświetlaniu wyników, a nie przy kasowaniu ich. Jeśli chcesz wykasować dane, o konkretnej dacie, to możesz najpierw wybrać je SELECTEM, a potem wykasować.

  1. <?php
  2.  
  3. $zapytanie = "SELECT * FROM 'tabela' WHERE costam='costaminnego' ORDER BY date LIMIT 1";
  4. $wynik = mysql_query ($zapytanie);
  5.  
  6. while ($row = mysql_fetch_array($wynik, MYSQL_ASSOC)) {
  7.  $del_query = "DELETE FROM 'tabela' WHERE costam='costaminnego' AND date='".$row['date']."'";
  8.  $del = mysql_query ($del_query);
  9. }
  10.  
  11. ?>
Spirit86
Cytat(zbig13 @ 2005-09-20 17:53:17)
No bo ORDER BY jest tylko do zapytania SELECT

tego pewien nie jestem, bo kiedyś już używałem ORDERA przy kasowaniu, z tego co pamiętam.
To jest bez sensu, 2 dodatkowe pytania zamiast jednego, musi się dac za pomocą jednego pytania.
Kicok
Znaczy wywala jakiś błąd? Bo u mnie to zapytanie działa dobrze (testowane na phpmyadminie, z tym że sortowałem po danych liczbowych a nie po dacie - ale to nie ma większego znaczenia)
Spirit86
Problem polega na tym, że jak dam
  1. DELETE
  2. FROM `tabela` WHERE JAKIS WARUNEK
  3. ORDER BY `date` ASC LIMIT 2

jakiś warunek, wtedy się sypie i w phpmyadmin i w skrypcie. :\

moje pytanie:
  1. DELETE
  2. FROM `tabela` ORDER BY `date` ASC WHERE UPPER( cos ) = 'los' LIMIT 1


wywala błąd:
  1. #1064 - Something is wrong in your syntax obok 'ORDER by `date` ASC WHERE UPPER( cos ) = 'los' LIMIT 1' w linii 1

który jak zwykle nie wiele mówi winksmiley.jpg
Kicok
bo ORDER BY dajemy po warunkach
Spirit86
próbowałem i tak i tak. Przez przypadek wkleiłem nie ten kod, co trzeba, normalnie mam WARUNEK, ORDER
sobstel
Cytat(Spirit86 @ 2005-09-20 19:37:06)
próbowałem i tak i tak. Przez przypadek wkleiłem nie ten kod, co trzeba, normalnie mam WARUNEK, ORDER

że się upewnie, kolejnosc masz WHERE, ORDER, LIMIT ?

tak czy owak, order oczywiscie mozna stosowac w delete
Spirit86
  1. DELETE
  2. FROM `tabela` WHERE UPPER( cos ) = 'los'
  3. ORDER BY `date` ASC LIMIT 1


nie wiem, co Wy posty chcecie nabić, czy co?
mike
1. Nie to forum. Przenoszę na: Bazy danych.
2.
Cytat(Spirit86 @ 2005-09-20 18:02:46)
Cytat(zbig13 @ 2005-09-20 17:53:17)
No bo ORDER BY jest tylko do zapytania SELECT

tego pewien nie jestem, (...)

Za to ja jestem pewien. ORDER BY można używać w konstrukcji DELETE. Jeżeli ktoś ma wątpliwości: DELETE Syntax

3. ORDER BY można stosować w konstrukcji DELETE dopiero od wersji 4.0.2 MySQL'a (bo podejrzewam że to o nim mowa). Może masz starszego.

Poza tym zapytanie które napisałeś w ostatnim poście powinno działać.
Spirit86
Tak chodzi o MySQL.
Masz rację, mam starą wersję: 3.23.58 :\
Ech nie da się tego wykonać, aby było kompatibilne ze starszymiy wersjami bazy danych? To bardzo ważne smile.gif Może innaczej zmodyfikowac zapytanie / mam ilośc rekordów, ilość dozwolonych rekordów.
mike
Cytat(Spirit86 @ 2005-09-20 22:42:12)
Ech nie da się tego wykonać, aby było kompatibilne ze starszymiy wersjami bazy danych?

Niestety, nie da się.

Alternatywą byłoby podzapytanie, ale Twoja wersja MySQL'a też ich nie obsłuży.

Jedyne wyjście w tej sytuacji podał zbig13. Ale zamiast tego polecałbym Ci zmianę MySQL'a na 4.1 bo pomijając że sam MySQL jest niedorozwiniętą bazą danych, to wresja 3.23.58 to już zamierzchłe czasy epoki lodowcowej.
Spirit86
Cytat(mike_mech @ 2005-09-21 07:58:14)
wresja 3.23.58 to już zamierzchłe czasy epoki lodowcowej.

Taka wersja jest dołączona do najnowszego Krasnala winksmiley.jpg.
Ściągnełem najnowszą wersję, wgrałem ja i wszystko gra.
Zastanawiam sie tylko czy nie zrobić jakiegoś dodatkowego polecenia, bo nie na wszystkich serwerach jest MySQL 4+. Standartem jest, jeszcze, wersja 3.*.*, czy mi się wydaje? Potrzebuję tej informacji ze względu na to, że piszę to do CMS'a, który stram się pisać zgodny ze starszymi wersjami php oraz MySQL.
dr_bonzo
Na serwerach jest glownie wersja 4.0, zadko 4.1. Tak ze pisz conajmniej pod 4.0, bo zanim skonczysz to juz nie bedzie 3ki, a byc moze zapanuje czas 4.1.

Cytat
piszę to do CMS'a, który stram się pisać zgodny ze starszymi wersjami php oraz MySQL.

Ale po co -- chyba nie piszesz pod php3? Wiekszosc hostingow posiada najnowesze wersje oprogramowania (lub starsze, rozniace sie cyfra na ostatniej pozycji wersji), a pisanie w zgodnosci ze starymi wersjami uniemozliwi ci skorzystanie z mozliwosci nowych wersji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.