#mysql #sql #select #sql-delete
#mysql #sql #выберите #sql-удалить
Вопрос:
У меня есть набор данных, которые мне в основном нужно «очистить»
Пользователь вводит свой любимый аромат в форму, и в форме у меня есть автозаполнение, чтобы помочь в выборе и, надеюсь, сократить орфографические ошибки, что жизненно важно для поставленной задачи.
Например, ниже приведены данные, которые у меня есть для Paco Rabanne 1 Миллион продуктов — однако я хочу, чтобы они выбрали Paco Rabanne 1 миллион, но я не хочу, чтобы у них был выбор различных лосьонов, мыла, дезодоранта и т. Д. И т. Д. Меня Интересует бренд и выбор аромата.
Пример данных, которые у меня есть, показан ниже.
Paco Rabanne 1 Million Gift Set
Paco Rabanne 1 Million Deodorant Stick 75ml
Paco Rabanne 1 Million Deodorant
Paco Rabanne 1 Million Eau de Toilette
Paco Rabanne 1 Million Gift Set 50ml
Paco Rabanne 1 Million Shower Gel 150ml
Paco Rabanne 1 Million Eau De Toilette Spray 100ml
Paco Rabanne 1 Million After Shave Lotion 100ml
У меня есть запрос, который удаляет определенные слова из заголовка элемента и показывает, что осталось
Запрос:
select DISTINCT( TRIM( LEFT(title,
IF( LOCATE('Deodorant', title), LOCATE('Deodorant', title) - 1,
IF( LOCATE('Shower', title), LOCATE('Shower', title) - 1,
IF( LOCATE('Refillable', title), LOCATE('Refillable', title) - 1,
IF( LOCATE('Spray', title), LOCATE('Spray', title) - 1,
IF( LOCATE('ml', title), LOCATE('ml', title) - 1,
999
)
)
)
))))) FROM `PRprod_FRAGRANCES`
Это в основном выбирает из таблицы, пропуская любую повторяющуюся строку с дезодорантом в названии или душем и т. Д. И т. Д., Но я хочу постоянно удалять записи вместо того, чтобы запускать этот запрос каждый раз, что дорого, поскольку в таблице более 200 000 строк
По сути, я хочу изменить запрос, чтобы он не отображал строки, которые мне не нужны, а фактически удалял их вместо этого.
Если нет другого способа решить эту проблему?
Это определение таблицы:
field, type, NULL, Key, Default, Extra
autoc_id, int(11), NO, PRI, , auto_increment
title, varchar(128), YES, , ,
genre, varchar(128), YES, , ,
author, varchar(128), YES, , ,
actors, varchar(256), YES, , ,
artist, varchar(128), YES, , ,
main_category, varchar(128), NO, , ,
dateadded, timestamp, NO, , CURRENT_TIMESTAMP,
Комментарии:
1. Самое простое решение — использовать
WITH
. напримерWITH results ( <select> ) DELETE FROM results
2. @BradChristie — Не в MySQL это не так. Он не поддерживает /CTEs
3. Д’о. Неправильно прочитал и не распознал MySQL. Мои извинения, я думаю о SQL-сервере
4. @DarrenSweeney — Дайте нам больше информации о таблице и логике, которая вам нужна… Есть ли у записей первичные ключи? Допустим, мы идентифицируем дюжину записей, которые возвращают тот же результат функции, которую вы дали, как нам определить, какую запись удалить? и т.д. и т.п.
5. @Dems Я переписал вопрос, поскольку он был немного запутанным, надеюсь, теперь понятнее.
Ответ №1:
Ваш вопрос все еще немного расплывчатый.
В вашем примере у вас есть данные…
Paco Rabanne 1 Million Gift Set
Paco Rabanne 1 Million Deodorant Stick 75ml
Paco Rabanne 1 Million Deodorant
Paco Rabanne 1 Million Eau de Toilette
Paco Rabanne 1 Million Gift Set 50ml
Paco Rabanne 1 Million Shower Gel 150ml
Paco Rabanne 1 Million Eau De Toilette Spray 100ml
Paco Rabanne 1 Million After Shave Lotion 100ml
Есть ли какие-либо другие поля в вашей таблице? Например, Идентификатор и т. Д.? Или это только одно поле?
И приведенные выше примеры появляются только один раз или они появляются несколько раз каждый?
Разбивка ваших данных на группы на основе вашего кода дает следующие группы…
Original | After Processing
Paco Rabanne 1 Million Deodorant | Paco Rabanne 1 Million
Paco Rabanne 1 Million Deodorant Stick 75ml | Paco Rabanne 1 Million
Paco Rabanne 1 Million Shower Gel 150ml | Paco Rabanne 1 Million
Paco Rabanne 1 Million Eau De Toilette Spray 100ml | Paco Rabanne 1 Million Eau De Toilette Spray 10
Paco Rabanne 1 Million Gift Set 50ml | Paco Rabanne 1 Million Gift Set 5
Paco Rabanne 1 Million After Shave Lotion 100ml | Paco Rabanne 1 Million After Shave Lotion 10
Paco Rabanne 1 Million Gift Set | Paco Rabanne 1 Million Gift Set
Paco Rabanne 1 Million Eau de Toilette | Paco Rabanne 1 Million Eau de Toilette
Примечание: я думаю, вам не нужен a - 1
в ml
фильтре. Это превращается 100ml
в 10
.
В случае первой группы вы хотите, чтобы все записи были удалены и заменены одной записью, говорящей просто Paco Rabanne 1 Million Deodorant
? Или вы хотите, чтобы 2 из них были удалены, а 1 из них остался? И если да, то как мы должны определить, что сохранить?
В случае следующих трех групп в каждой группе есть только 1 запись, но вы 0ml
отрубили конец. Вы хотите заменить эти записи сокращенной версией? Или ничего с ними не делать?
Последние две группы также имеют только по 1 записи в каждой, и фильтр ничего с ними не сделал. Их оставляют в покое?
Затем, как только вы обработаете это, будут ли новые данные добавляться снова и снова? Вам нужен код, который вы можете запускать повторно, или вам нужно сделать это только за один запуск?
К сожалению, без дополнительной информации я не думаю, что мы сможем сильно помочь.
Комментарии:
1. Я знаю, что это беспорядочно, но, боюсь, я мало что могу сделать с набором данных — в идеале я хочу вернуть Пако Рабанну 1 миллион за весь набор, только за одну строку, но не уверен, что это удастся сделать.
2. Изначально это один запуск, но я могу выполнить его как да, новые данные будут появляться периодически, поэтому я знаю, что это всегда будет незавершенная работа
3. Однако первоначальный вопрос все еще остается в силе: возможно ли преобразовать SELECT в оператор DELETE?
4. Мои вопросы все еще остаются в силе. «Изменение выбора на УДАЛЕНИЕ» не является допустимым вопросом. Нам нужно больше знать о таблице… Я спросил, есть ли в таблице поле id. У вас есть полное определение таблицы?
Ответ №2:
Для меня это больше похоже на неадекватную модель данных :
Если у вас есть контроль над количеством таблиц, в которых хранятся данные, и вы можете добавлять таблицы по своему усмотрению, самым чистым решением было бы иметь две таблицы: одну для ароматов, одну для упаковки.
Комментарии:
1. Согласен, но как вы разделяете данные, которые на самом деле являются исходным вопросом .. и да, я согласен, но должен работать с тем, что мне дано