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 ... молча избегать повторяющихся строк. Если у вас нет УНИКАЛЬНОГО ключа, вам никогда не нужно снова искать строку?

Если вы уже разрешили дубликаты и вам нужно от них избавиться, это другой вопрос.

Я бы попытался устранить проблему в первую очередь. Есть методы для устранения этой проблемы. Первое, что у меня на уме - вы можете сгенерировать случайную строку и сохранить ее как в сеансе, так и в виде скрытого поля в форме. Эта случайная строка должна генерироваться каждый раз, когда отображается форма. Когда пользователь отправляет форму, вам необходимо убедиться, что ключ сеанса и ключ ввода совпадают. Убедитесь, что вы генерируете разные ключи для каждого запроса. Таким образом, когда пользователь обновляет страницу, он отправляет старый ключ, и он не будет совпадать.

Другое решение может состоять в том, что если эти данные всегда должны быть уникальными в базе данных, проверьте, есть ли эти точные данные в базе данных перед вставкой. И если данные уникальны, скажем, адрес электронной почты, вы можете создать уникальный индекс ключа. Поэтому это поле должно быть уникальным в таблице.

Другие вопросы по тегам