MySQL SELECT DISTINCT строк (не столбцов) для фильтрации $_POST для дубликатов
Я пытаюсь отфильтровать строки из таблицы MySQL, где все $_POST
данные хранятся из онлайн-формы. Иногда интернет-соединение пользователя останавливается или браузер портится, и новая страница после отправки формы не отображается (хотя INSERT сработал и строка таблицы была создана). Затем они нажимают "Обновить" и дважды отправляют свою форму, создавая дублирующую строку (за исключением столбцов меток времени и идентификаторов автоинкремента).
Я хотел бы выбрать уникальные формы представления. Это должно быть действительно распространенной задачей, но я не могу найти то, что позволяет мне звонить с DISTINCT
применяется к каждому столбцу, за исключением временной метки и идентификатора, в сжатой форме (вроде как SELECT id, timestamp, DISTINCT everything_else FROM table;
, На данный момент я могу сделать:
CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS (
SELECT DISTINCT everything,except,id,and,timestamp
FROM table1
);
SELECT * FROM table1 LEFT OUTER JOIN temp1
ON table1.everything = temp1.everything
...
;
Моя таблица содержит 20 тысяч строк и около 25 столбцов (классификационные функции для машинного обучения). Этот запрос длится вечно (так как я предполагаю, что он пересекает 20 тыс. Строк по 20 тыс. Раз?) Я никогда даже не позволял ему выполняться до конца. Какой стандартный способ практики это сделать?
Примечание. Этот вопрос предлагает добавить индекс к соответствующим столбцам, но в индексе может быть не более 16 ключевых частей. Должен ли я просто выбрать наиболее вероятные уникальные? Таким образом, я могу найти около 700 дубликатов за 2 секунды, но не могу быть уверен, что не выбрасываю уникальную строку, потому что мне также приходится игнорировать некоторые столбцы при указании индекса.
2 ответа
Если у тебя есть UNIQUE
ключ (кроме AUTO_INCREMENT
), просто используйте INSERT IGNORE ...
молча избегать повторяющихся строк. Если у вас нет УНИКАЛЬНОГО ключа, вам никогда не нужно снова искать строку?
Если вы уже разрешили дубликаты и вам нужно от них избавиться, это другой вопрос.
Я бы попытался устранить проблему в первую очередь. Есть методы для устранения этой проблемы. Первое, что у меня на уме - вы можете сгенерировать случайную строку и сохранить ее как в сеансе, так и в виде скрытого поля в форме. Эта случайная строка должна генерироваться каждый раз, когда отображается форма. Когда пользователь отправляет форму, вам необходимо убедиться, что ключ сеанса и ключ ввода совпадают. Убедитесь, что вы генерируете разные ключи для каждого запроса. Таким образом, когда пользователь обновляет страницу, он отправляет старый ключ, и он не будет совпадать.
Другое решение может состоять в том, что если эти данные всегда должны быть уникальными в базе данных, проверьте, есть ли эти точные данные в базе данных перед вставкой. И если данные уникальны, скажем, адрес электронной почты, вы можете создать уникальный индекс ключа. Поэтому это поле должно быть уникальным в таблице.