Как сформировать SQL запрос на удаление строк по рейтингу?
У меня таблица песен `rus` в которой есть столбец рейтинга этих песен как мне сделать SQL запрос который удалил бы те строки которые имеют рейтинг не входящий в топ 20 т.е первых 20 песен у который самый высокий рейтинг он оставит а остальные удалит.
Пробовал запрос ниже он сначала не удаляет а потом удаляет все строки таблицы
$query = "DELETE FROM `rus` ORDER BY `reyting` LIMIT 20";
mysql_query($query);
VicTHOR, я его сделал первичным нажав на ключик так как до этого не мог редоктировать поля таблицы. Я поставил у столбца idvol avto increment а запросы как не работали на удаление так и не работают
$res = mysql_query("SELECT idvol,reyting,name,vol,file,kto,rey,DATE_FORMAT(data,'%d %M %Y') AS data,orderdate FROM `rus` ORDER BY `reyting` DESC ");
while($row = mysql_fetch_array($res))
{
//вот запрос на выбор id а что он мне даст при удалении не могу понять.
$zaprosid=mysql_query("SELECT `idvol` FROM `rus`");
Андрей, я понял так делаем запрос SELECT на выбор id песен которые находятся в топ 20 которые не надо удалять:
$liveid = mysql_query("SELECT idvol FROM `rus` ORDER BY `reyting` DESC LIMIT 20");
А как связать этот запрос с запросом на удаление?: Что будет после NOT IN (там должны быть перечиленны id песен которые не надо удалять но как мне туда записать id каждого я же незнаю)
$query = "DELETE * FROM `rus` WHERE `idvol` NOT IN(...)";
mysql_query($query);
dazle, в цикле получи набор id в массив и подставь его в запрос, хоть так:
if($ids) {
$sql = 'delete from `rus` where `idvol` not in('.implode(', ', $ids).')';
mysql_query($sql);
}
так можно делать только с тем набором данных, которые в программе ты посчитал сам.
ни в коем случае нельзя так делать с тем, что пришло от пользователя!
$ids = mysql_query("SELECT `idvol` FROM `rus` ORDER BY `reyting` DESC LIMIT 2");
if($ids) {
$sql = 'DELETE FROM `rus` WHERE `idvol` NOT IN('.implode(', ', $ids).')';
mysql_query($sql);
}
Андрей, через 1 запрос на выборку выдает не то что надо:
$ids = mysql_query("SELECT `idvol` FROM `rus` ORDER BY `reyting` DESC LIMIT 2");
echo $ids;
// Resource id #23
Resource id #25
Resource id #27
Resource id #29
У меня 4 песни в списке после каждой песни пишется одна из приведенных выше строк
Дмитрий Шицков, я читал недавно книгу по SQL там был такой же запрос на удаление, но там идет SELECT c другой таблицы должен брать параметры на удаление а не с той же, поэтому я тот вариант отбросил т.к не хотел создавать новую таблицу только для рейтинга
Дмитрий Шицков, я прям в бд в SQL ввел запрос на удаление и вот что вышло:
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
(Эта версия MySQL еще не поддерживает 'LIMIT & IN/ALL / ANY/SOME subquery')
как так если я недавно перешел со старого денвера на Endels в котором все новое.
Как мне быть?
$ids = mysql_query("SELECT `idvol` FROM `rus` ORDER BY `reyting` DESC LIMIT 2");
while ($row = mysql_fetch_assoc($ids)) {
$i=$row['idvol'];
if($i) {
$sql = 'DELETE FROM `rus` WHERE `idvol` NOT IN('.implode(', ', $i).')';
mysql_query($sql);
}
}
Предупреждение: implode (): недопустимые переданные аргументы G:\home\localhost\subdomain\rus.php on line 116
$ids = mysql_query("SELECT `idvol` FROM `rus` ORDER BY `reyting` DESC LIMIT 2");
while ($row = mysql_fetch_assoc($ids)) {
$i=$row;
if($i) {
$sql = 'DELETE FROM `rus` WHERE `idvol` NOT IN('.implode(', ', $i).')';
mysql_query($sql);
}
}
Он удаляет все записи в таблице (переделал я значение переменной $i $i=$row) , но когда я меняю лимит во всей этой богодельне на 1 (...ORDER BY `reyting` DESC LIMIT 1) он удаляет все записи кроме той у которой был самый высокий рейтинг вот как, а почемуто чтобы оставить например 2 записи не работает и удаляет все=(
Дмитрий Шицков, из 4-ех песен остается только 1 с самым высоким рейтингом что опять сделал не так?:
$ids = mysql_query("SELECT `idvol` FROM `rus` ORDER BY `reyting` DESC LIMIT 2");
$row = mysql_fetch_array($ids);
$i=$row; // $i=$row['idvol']; - тогда ваще ниче не удаляет
if($i) {
$sql = 'DELETE FROM `rus` WHERE `idvol` NOT IN('.implode(', ', $i).')';
mysql_query($sql);
}