• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
[آموزش]کار با رکوردهای/سطرهای تکراری در MySQL
#1
Information 
سلام
قطعا پیش آمده براتون که در دیتابیس رکوردهای تکراری براساس یک فیلد رخ بده
مثلا ، کاربری با نام کاربری یکسان منتها بصورت حروف بزرگ و کوچیک ثبت نام کرده باشه Reza , reza rEzA
یا حتی مثلا شخصی به اسم رضا اقدام به ارسال چندین نظر کرده باشه
یا اینکه یکی از مطالب اخبارتون دو بار ثبت شده باشه
علی ای حال ، قطعا این مساله رخ میدهد
و اما ما میخوایم ببینیم با اینها چکار کنیم

خب ابتدا من یک دیتابیس تمثیلی میسازم و چند رکورد توش اضافه میکنم که یوزرنیم های تکراری داره
کد:
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `users` (`id`, `username`, `name`) VALUES
(1,    'reza',    'رضا'),
(2,    'ReZa',    'رضا'),
(3,    'Ali',    'علی'),
(4,    'ali2',    'علی2'),
(5,    'ali',    'علی'),
(6,    'ALi',    'علی با حرف بزرگ'),
(7,    'ali',    'علی با حرف کوچیک');


خب ابتدا یه خروجی بگیریم ببینم نتیجه چی هست
کد:
SELECT  * FROM `users` ;
[عکس: uid_1_fid501_1395-05-13_12_58_39_221151957.png]
خب نتیجه 7 رکورد هست که رکورد 5 با هفت کاملا برابر هستن خب میخوایم این تکراری نشون داده نشه

کد:
SELECT  * FROM `users` group by username;
[عکس: uid_1_fid502_1395-05-13_13_01_36_808888295.png]

خب اوضاع درست شد ظاهرا اما میبینیم رکورد 1 با 2 و رکوردهای 5و3و6 فقط از نظر بزرگی کوچکی تفاوت دارن خب بیاییم اینم درست کنیم
کد:
SELECT  * FROM `users` group by LOWER(username);
[عکس: uid_1_fid503_1395-05-13_13_03_21_586066935.png]

خب الان تقریبا خروجیمون درسته ، بیاییم یه کار دیگه هم بکنیم ببینیم از هر رکورد تکراری چند تا وجود داره
کد:
SELECT  LOWER(username),count(LOWER(username)) FROM `users` group by LOWER(username);
[عکس: uid_1_fid504_1395-05-13_13_06_22_452641923.png]

خب آنچه مشخص هست رکوردهایی که تعدادشون بیشتر از یک هست تکراری هستن پس فقط نیاز به اونها داریم
کد:
SELECT  LOWER(username),count(LOWER(username)) FROM `users` group by LOWER(username) having count(LOWER(username))>1 ;
[عکس: uid_1_fid505_1395-05-13_13_07_25_184688061.png]


خب تا اینجا تقریبا یه سری اطلاعات از رکوردهای تکراری گرفتیم ، اما اصل ماجرا اینجاست میخوایم این رکورهای تکراری رو
از دیتابیس حذف کنیم یعنی مثلا کاربری که با یوزر ali ثبت نام کرده چندین بار
فقط یکی از رکورهاش بمونه و بقیه حذف بشه
قدم اول اینه ، لیست کاربران با یوزرنیم یکتا رو در میاریم به همراه کلید اصلی یا همون آی دی
کد:
SELECT  id,username,count(username) FROM `users` group by lower(username) ;
[عکس: uid_1_fid506_1395-05-13_13_09_53_974360830.png]

در این نتیجه باید id رو جدا کنیم
کد:
select id from (SELECT  id,username,count(username) FROM `users` group by lower(username)) _d
[عکس: uid_1_fid508_1395-05-13_13_10_41_999912785.png]

سپس با یک سابکوئری اعلام میکنیم که در جدول users کلیه رکوردها پاک شود به غیر از این شناسه id ها
کد:
delete from users where id not in (select id from (SELECT  id,username,count(username) FROM `users` group by lower(username)) _d )
[عکس: uid_1_fid509_1395-05-13_13_11_44_31273686.png]

و حالا مشاهده جدول
کد:
select * from users
[عکس: uid_1_fid510_1395-05-13_13_12_23_49757089.png]

یه کار دیگه هم بکنیم ، نام کاربری ها رو کلا به حروف کوچیک تبدیل کنیم
کد:
update users set username=LOWER(username)


و حالا مشاهده جدول مجددا
کد:
select * from users
[عکس: uid_1_fid512_1395-05-13_13_13_41_261591203.png]


امیدوارم از این آموزش لذت برده باشید
با تشکر ، رضا شیخله
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : Y.P.Y undefined kasbookar Alaa ayoubsys


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان