Удалить дублирующиеся строки из моей базы данных + Убедитесь, что больше дублирования не будут добавлены

Я знаю, что многие люди задавали этот вопрос раньше, но я не нашел абсолютного ответа, и я видел много разных ответов, поэтому я запутался.

Я получил следующие данные, например, в моей базе данных SQL:

user: test
code: blablah
email: [email protected]

user: zeus
code: olympus
email: [email protected]

user:test
code:123132
email: [email protected]

user:test
code:987654331
email: [email protected]

user: usa
code:1233333
email: [email protected]
  1. Я хочу удалить все строки, содержащие одно и то же имя пользователя. Я хочу выполнить запрос, который проверит, существует ли более одной строки для каждого имени пользователя.
    если для определенного имени пользователя есть 2 или более строк, ВСЕ строки, содержащие это имя пользователя, будут удалены.

Что означает, что я хочу, чтобы база данных, в этом примере, была в конце

   user: zeus
code: olympus
email: [email protected]

user: usa
code:1233333
email: [email protected]

В конце я хочу убедиться, что в моей базе данных нет дублированных строк / данных. Я не хочу оставлять даже одну строку с дублированным именем пользователя, потому что «код» на самом деле является уникальным кодом, который генерируется при каждом сеансе входа в систему и уничтожает предыдущие коды, и я не могу знать, какой код является последним, потому что Я не использовал «созданную» строку с функцией date ().


  1. Я хочу убедиться, что в будущем мне не понадобится очищать больше дублированных строк, поэтому я хочу убедиться, что при каждом входе в систему / регистрации на моем сайте система будет запускать проверку, если имя пользователя уже есть в базе данных. ,
    Если это произойдет .. ТОЛЬКО на его строку «code» будет оказано влияние, и новый код [который будет сгенерирован при входе в систему] заменит старый код в той же строке, которая содержит имя пользователя.
    Если имя пользователя отсутствует в базе данных, система вставит все его данные в строку. Что означает: пользователь, код & Эл. адрес.
    В следующий раз, когда он войдет в систему, система обновит только его строку кода в текущей строке и не добавит новую строку с тем же пользователем & тот же адрес электронной почты с новым кодом.

Прямо сейчас я использую следующий код:

"INSERT INTO logs (user, code, email) VALUES('$user', '$code', '$email')";

Я думаю об изменении его на

INSERT INTO logs(user, code, email)VALUES($user,$code,$email)ON DUPLICATE KEY UPDATE    $code=VALUES(code)

чтобы получить то, к чему я стремлюсь. Мне нужно изменить строку «пользователь» в моей базе данных для уникальной строки для этого.

Кто-то предложил мне использовать следующий код:

 "UPDATE `logs` SET `code` = '$code' WHERE `user` = '$user' AND `email` =  '$email'";

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

Большое спасибо !

0

Решение

для первого вопроса вы можете использовать этот запрос:

delete from logs where user IN
(SELECT * from (select user FROM logs GROUP BY user HAVING COUNT(user) > 1) tempTable);

для второго вопроса, так как у вас уже есть первичный ключ, который вы не можете использовать при обновлении дубликата ключа при user колонка. Но вы можете использовать два запроса один за другим сначала Update и второй insert пытаться:

    //this Update query is executed if the user is already there. If the user is not there this query will fail and php will go to next query
$query1 = update logs set code = $code where user = $user;

//This query will insert the data only if `user` is not found

$query2 = insert into logs ($user,$code,$email)
select user,code,email
from logs
where not exists (select * from user where user = $user)
limit 1;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]