Предположим, мне нужно напечатать 3, 5, 9, 20, 34 и так далее …
Строки по положению не имеют реального значения в базе данных (по крайней мере, я не могу придумать ни одного). Почему вам небезразлично его фактическое расположение строк?
Как вы узнали, что третья запись – это запись, которую вы хотите удалить? Сопоставьте идентификатор, сопоставьте фразу в другом поле, сделайте что-нибудь, чтобы однозначно идентифицировать запись как запись, к которой вы хотите получить доступ. Выполнение этого путем размещения строки не сделает этого для вас.
Если у вас есть пять записей, которые соответствуют точно, и вы хотите их удалить, то добавьте LIMIT 1 в конец вашего оператора DELETE. Если они точны, строка не имеет значения. 3-й или 5-й или 7-й вопрос не имеет значения, поскольку они точно соответствуют вашему запросу. Поэтому удалите один из ваших соответствующих запросов.
Теперь кажется, что вы показываете пользователям таблицу данных в некотором порядке, которая может дублироваться или не дублироваться, и позволяет им удалять строку. Вы берете фактическое местоположение строки вместо хранения Первичного ключа с каждой отображаемой строкой. Затем, когда пользователь выбирает удаление, вы просто используете прикрепленный первичный ключ к строке и удаляете эту строку.
Вы говорите: «Первичный ключ с несколькими другими полями одинаковый» – это не может быть правдой, поскольку вы не можете иметь идентичные первичные ключи. Теперь я думаю, что у вас есть некоторые недостатки в дизайне базы данных. Отправьте схему таблицы и образец того, что вы делаете. Нет смысла продолжать, если бы вы поддержали себя в углу с дизайном (что звучит)
(Я не могу комментировать другие сообщения, поэтому обновления должны быть отредактированы в этом сообщении)
Вы также можете использовать переменную номера строки:
SELECT * FROM ( SELECT t.*, @rownum = @rownum + 1 AS rank FROM TABLE t, (SELECT @rownum := 0) r ORDER BY ID LIMIT 0, 34 ) Q WHERE rank in (3, 5, 9, 20, 34)
Я бы попытался использовать LIMIT
smartly, иначе он будет сканировать всю вашу таблицу каждый раз.
Основываясь на вашем описании вашего сценария …
мой сценарий: мне нужно удалить только одну строку … есть несколько одинаковых строк .. поэтому использование delete с предложением where удалит все из них. Также, скажем, есть 5 одинаковых строк .. и мне нужно удалить треть из этих 5 строк …
Вам действительно нужно быть осторожным с этим, иначе вы удалите неправильные строки. Подумайте о хорошем критерии, который бы отличал строки, которые вы хотите удалить из других строк, скажем .. вы хотите удалить новейшие или все, кроме новейших …
Вы можете использовать расширенную версию трюка @rownum, чтобы удалить Nth из каждой группы. Но прежде чем я пойду, что было бы лучше узнать больше о вашей конкретной проблеме.
А теперь вот вышла обезьяна из рукава:
Предположим, что существует 5 одинаковых строк. Пользователь нажимает на 3-ю строку и просит удалить ее … где запрос не будет эффективным, поскольку он удаляет первую строку, которая соответствует предложению where или всем строкам, которые соответствуют ему .. как это я удаляю только третью строку и оставляю всех остальных нетронутыми .. ???
Забудьте все, что я сказал. Вам нужно AUTO_INCREMENT
поле AUTO_INCREMENT
в вашей таблице, однозначно идентифицируя ваши записи. Затем вы можете использовать DELETE FROM table WHERE id = $id
. Благодаря OMG Ponies для терапии OP;)
OFFSET часть предложения LIMIT работает с запросом SELECT.
Что ты хочешь делать??
Строки в таблице SQL не находятся в определенном порядке. Вы можете заказать их по определенному полю, например, ID, который, как я полагаю, является значением автоматического приращения. Если вы хотите, чтобы вторая строка была отсортирована по идентификатору, вы можете выполнить запрос, например
SELECT * FROM MyTable ORDER BY ID LIMIT 1,1
Чтобы получить строку 19, вы сделали бы
SELECT * FROM MyTable ORDER BY ID LIMIT 18,1
Используйте инструкцию limit для определенного набора строк. Если вам нужны строки с 10 по 19, вы можете использовать
SELECT * FROM MyTable ORDER BY ID LIMIT 9,10
В предельном выражении первое число представляет номер строки (на основе 0), а второе число – количество возвращаемых строк.