Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Usuwanie wyznaczonej liczby rekordow ktorych konkretne pola maja najmniejsza/najwieksza wartosc w tabeli
Forum PHP.pl > Forum > Przedszkole
PiXel2.0
Mam tabele w ktore sa pola zawierajace wartosc liczbowa i chcialbym skonstruowac JEDNO zapytanie ktore wykona pewna operacje.

Powiedzmy, ze ta tabela zawiera top 100 najdrozszych produktow a pole 'cena' zawiera cene produktu.
Tabela powinna zawierac maksymalnie 100 produktow wiec gdy do tabeli zostanie dodanych 7 nowych o wysokiej cenie to tyle samo starych trzeba usunac (oczywiscie przedstawiona wyzej sytuacja jest fikcyjna i wymyslilem ja aby najprosciej przedstawic moj problem bo jest on nieco bardziej zlozony).

Chodzi o to aby za pomoca DELETE usunac te 7 rekordow w ktorych wartosc pola 'cena' jest najmniejsza.
Czy jest to mozliwe do osiagniecia za pomoca tylko jednego zapytania questionmark.gif

Normalnie najpierw pobralbym okreslona liczbe rekordow w ktorych wartosc pola 'cena' jest najnizsza przy pomocy ORDER BY oraz LIMIT w celu pozyskania kluczy tych rekordow a pozniej za pomoca kolejnego zapytania usunal te rekordy na podstawie wczesniej pobranych kluczy, ale to dwa lub wiecej zapytan a ja chcialbym to zrobic za pomoca tylko jednego zapytania.

Czy jest to mozliwe a jesli tak to w jaki sposob questionmark.gif
HuTu
Zgodnie z dokumentacją MYSQL składnia DELETE przedstawia się następująco:
Kod
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]


Poniżej jest też napisane:
Cytat
If the ORDER BY clause is specified, the rows are deleted in the order that is specified. The LIMIT clause places a limit on the number of rows that can be deleted.


Więc... ja bym spróbował:
Kod
DELETE FROM produkty ORDER BY cena LIMIT 10


Nigdy czegoś takiego nie robiłem, ale to chyba powinno zadziałać. Taka konstrukcja zapytania możliwa jest tylko, jeśli wysyłasz je do jednej tabeli.
phpion
Cytat(PiXel2.0 @ 20.12.2007, 06:26:31 ) *
Chodzi o to aby za pomoca DELETE usunac te 7 rekordow w ktorych wartosc pola 'cena' jest najmniejsza.

  1. DELETE FROM tabela ORDER BY cena DESC LIMIT 7 ;

// EDIT
aczkolwiek... lepiej tak:
  1. DELETE FROM tabela WHERE cena IN (SELECT DISTINCT cena FROM tabela ORDER BY cena DESC LIMIT 7 );


Pierwsze zapytanie usunie po prostu 7 rekordów o najniższej cenie czyli mając np.
Kod
10
20
30
40
50
60
70
70
70

te 2 ostatnie 70 nie zostaną usunięte. Drugie zapytanie natomiast powinno usunąć poprawnie wszystkie te rekordy.
PiXel2.0
Dzieki smile.gif
Myslalem, ze ORDER BY i LIMIT moga wystepowac tylko za SELECT.
Musze sie wziasc za nauke SQL'a bo jeszcze cienki w tym jestem.
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.