PDA

View Full Version : درج خودکار id برای هر گروه



intel_amd
سه شنبه 10 تیر 1393, 05:11 صبح
سلام به همگی دوستان
یک جدول را در نظر بگیرید که داخلش ردیف هائی به فرم زیر درج می شود

گروه id نام فامیل

حالا چند گروه مثل A,B,C,D را در نظر بگیرید
حال مثلا هر کس با گروه A درج می شود به ترتیب id بخورد یعنی رضا از گروه A چون اول درج شده id=1 و علی از گروه A چون دوم درج شده id=2
همین حالت برای گروه های دیگر هم هست یعنی محمد بعد از علی درج شده اما چون اولین نفر در گروه B هست id=1
به هر تعداد گروه می توان داشت

یک سوال دیگه : آیا یک جدول هر چقدر به آن سطر اضافه شود مشکلی ندارد؟ سرعت پائین نمیاد؟ سرور سنگین نمیشه؟ اگر میشه از چه تعداد به بالا خوب نیست؟

alex_pk
سه شنبه 10 تیر 1393, 11:25 صبح
میتونی قبل insert ، دیتابیس رو چک کنی که ببینی چند نفر با گروه فوق تا الان ثبت شدن ($num) بعد یکی بهشون اضافه میشه و میشه ID نفر بعدی. $id=$num+1
یه چیزی تو این مایه ها:(البته باید بسط بدیش و کوتاهش کنی)


$result=mysqli_query($con."select * from table where group=a");
$num=mysqli_num_rows($result);
$id=$num+1;
$sql2=insert into table (group,id,firstname,lastname) values ('a','$id','$firstname','$lastname')";

vahidqara
سه شنبه 10 تیر 1393, 15:15 عصر
میتونی قبل insert ، دیتابیس رو چک کنی که ببینی چند نفر با گروه فوق تا الان ثبت شدن ($num) بعد یکی بهشون اضافه میشه و میشه ID نفر بعدی. $id=$num+1
یه چیزی تو این مایه ها:(البته باید بسط بدیش و کوتاهش کنی)


$result=mysqli_query($con."select * from table where group=a");
$num=mysqli_num_rows($result);
$id=$num+1;
$sql2=insert into table (group,id,firstname,lastname) values ('a','$id','$firstname','$lastname')";

اینجوری درست نیست دوست عزیز... یعنی متوجه سوال دوستمون نشدی...
فرض کن از شماره 1 تا 9 به ترتیب رکورد داریم یعنی میشود 9 رکورد .. حال فردی با شماره ی 6 حذف میشه بعد طبق دستور شما تعداد رکورد برگشتی میشود 8 تا به علاوه 1
که میشه 9 یعنی رکورد 9 درج میشه ... با شماره 10 ...!!!!!
باید یه الگوریتم براش نوشت و روش فکر کرد..
برای تعداد رکوردهای جدول هم محدودیتی نداره عزیزم فقط تعداد فیلدهای که داده ی null دارند باید به حداقل برسه ..

ab.ali
سه شنبه 10 تیر 1393, 15:24 عصر
سلام به همگی دوستان
یک جدول را در نظر بگیرید که داخلش ردیف هائی به فرم زیر درج می شود

گروه id نام فامیل

حالا چند گروه مثل A,B,C,D را در نظر بگیرید
حال مثلا هر کس با گروه A درج می شود به ترتیب id بخورد یعنی رضا از گروه A چون اول درج شده id=1 و علی از گروه A چون دوم درج شده id=2
همین حالت برای گروه های دیگر هم هست یعنی محمد بعد از علی درج شده اما چون اولین نفر در گروه B هست id=1
به هر تعداد گروه می توان داشت

یک سوال دیگه : آیا یک جدول هر چقدر به آن سطر اضافه شود مشکلی ندارد؟ سرعت پائین نمیاد؟ سرور سنگین نمیشه؟ اگر میشه از چه تعداد به بالا خوب نیست؟

مرسی از این که همچین سوالی رو پرسیدی ، منم دوستان همچین مشکلی دارم و وقتی یک سطر رو حذف می کنم، ID ها مرتب نمی شن!:افسرده:

alex_pk
سه شنبه 10 تیر 1393, 16:15 عصر
اینجوری درست نیست دوست عزیز... یعنی متوجه سوال دوستمون نشدی...
فرض کن از شماره 1 تا 9 به ترتیب رکورد داریم یعنی میشود 9 رکورد .. حال فردی با شماره ی 6 حذف میشه بعد طبق دستور شما تعداد رکورد برگشتی میشود 8 تا به علاوه 1
که میشه 9 یعنی رکورد 9 درج میشه ... با شماره 10 ...!!!!!
باید یه الگوریتم براش نوشت و روش فکر کرد..
برای تعداد رکوردهای جدول هم محدودیتی نداره عزیزم فقط تعداد فیلدهای که داده ی null دارند باید به حداقل برسه ..

صحبت از حذف نشده بود
اگر قرار بر حذف هم باشه فرمایش شما صحیحه.
من مشابهش رو برای خودم نوشته بودم قبلا (برای ارسال مطالب به سایت)

aalmair
سه شنبه 10 تیر 1393, 16:41 عصر
/*

DROP TABLE IF EXISTS `test`.`groups`;
CREATE TABLE `test`.`groups` (
`id` bigint(20) unsigned NOT NULL DEFAULT '0',
`groupn` varchar(45) NOT NULL DEFAULT '',
`fname` varchar(45) NOT NULL DEFAULT '',
`lname` varchar(45) NOT NULL DEFAULT '',
PRIMARY KEY (`id`,`groupn`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



*/


$mysql_connect=mysql_connect('localhost','root','' );
mysql_select_db('test',$mysql_connect);
mysql_set_charset('utf-8',$mysql_connect) ;





function insert2group($group_name='',$fname='',$lname='')
{
global $mysql_connect;

mysql_query('select * from groups where groupn="'.mysql_real_escape_string($group_name,$mysql_conn ect).'" ;',$mysql_connect) ;


$count_group=mysql_affected_rows($mysql_connect) ;

if($count_group)
{

mysql_query('insert into groups set groupn="'.mysql_real_escape_string($group_name,$mysql_conn ect).'" ,id="'.($count_group+1).'" , fname="'.mysql_real_escape_string($fname,$mysql_connect). '" , lname="'.mysql_real_escape_string($lname,$mysql_connect). '" ;',$mysql_connect) ;

}else
{
mysql_query('insert into groups set groupn="'.mysql_real_escape_string($group_name,$mysql_conn ect).'" ,id="1" , fname="'.mysql_real_escape_string($fname,$mysql_connect). '" , lname="'.mysql_real_escape_string($lname,$mysql_connect). '" ;',$mysql_connect) ;

}

}

function delete2group($group_name='',$id=0)
{
global $mysql_connect;

mysql_query('delete from groups where groupn="'.mysql_real_escape_string($group_name,$mysql_conn ect).'" and id="'.$id.'" ;',$mysql_connect) ;


mysql_query('update groups set id=id-1 where id > '.$id.' ;',$mysql_connect) ;


}


insert2group('A','fname','lname') ;
//delete2group('A',1) ;

intel_amd
پنج شنبه 12 تیر 1393, 02:15 صبح
دوستان اینکه بیام تعداد اعضای هر گروه را بشمرم و بعلاوه 1 آن را به شماره گروه فرد جدید بدم یک مشکلی داره !
فرض کنید 5 یوزر همزمان اومدن تو گروه A عضو شن و هر 5 تا همزمان دیدن گروه A در این لحظه 4 عضو داره و هر 5 یوزر شماره گروهشون 5 میشه !

intel_amd
جمعه 13 تیر 1393, 23:38 عصر
اگر کسی راه حلی داره لطفا بگه

Veteran
شنبه 14 تیر 1393, 10:30 صبح
جدول رو در لحظه انجام عملیات مورد نظر که احتمال تداخل وجود داره قفل،و بعد از انجام عملیات باز کنید


mysql_query("LOCK TABLES test WRITE;");
mysql_query("UNLOCK TABLES;");

راهه دیگه ایی که وجود داره (http://barnamenevis.org/showthread.php?427327-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A7%D9%85%DA%A9%D8%A7%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%D8%B1%D9%86%D8%B2%DA%A9%D8%B4%D9%86-%D8%A8%D8%AC%D8%A7%DB%8C-%D9%82%D9%81%D9%84&p=1912669&viewfull=1#post1912669)

intel_amd
شنبه 14 تیر 1393, 11:46 صبح
تشکر از لطف شما
دوست دیگری از طریق فیلد auto inc گفتند راه حلی وجود دارد می خواستم ببینم یعنی چجوری از طریق فیلد auto inc میشه این کارو انجام داد این راه حل را میشه دوستان توضیح بدن؟

وقتی یک فیلد autoinc میسازم فقط 1 فیلد کانتر میندازه مثل حالت زیر

1
2
3
4

اما جدول من شامل یک فیلد گروه است که هر گروه کانتر خودشو داره مثل حالت زیر



گروهid گروه
آ 1
آ 2
آ 3
آ 4
ب 1
ب 2
ب 3
آ 5
آ 6
ب 4

alibehroozi
شنبه 14 تیر 1393, 12:11 عصر
2 راه :
1- شما میتونی یک آرایه از آخرین رکورد بگیری و آیدی رو داخل یک متغیر قرار بدید و در رکورد بعدی از اون استفاده کنید
2- شما میتونی توی phpmyadmin کالم id رو روی شمارش خودکار بذاری و خودش عدد قرار میده

اگر مشکل شما اینه که آیدی ها مرتب نمیشن میتونید با یک دستور تمام آیدی هارو ادیت کنید و پشت سر هم بگذارید ( 3 دستور )

در ضمن کالم های اصلی نمیتونن مثل هم باشن ( پریمری ) یعنی اگر ستون آیدی شما اصلی باشه با امکان شمارش خودکار نمیتونید 2 تا یک توی اون بگذارید

intel_amd
شنبه 14 تیر 1393, 20:50 عصر
جدول رو در لحظه انجام عملیات مورد نظر که احتمال تداخل وجود داره قفل،و بعد از انجام عملیات باز کنید


mysql_query("LOCK TABLES test WRITE;");
mysql_query("UNLOCK TABLES;");

راهه دیگه ایی که وجود داره (http://barnamenevis.org/showthread.php?427327-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A7%D9%85%DA%A9%D8%A7%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%D8%B1%D9%86%D8%B2%DA%A9%D8%B4%D9%86-%D8%A8%D8%AC%D8%A7%DB%8C-%D9%82%D9%81%D9%84&p=1912669&viewfull=1#post1912669)

الان اگر من بیام با این تکنیک جدول را قفل و بعد از انجام عملیاتم قفل را باز کنم به شکل زیر ما یک مشکل خواهیم داشت !

یوزر وارد میشه - جدول را قفل میکنه - رکوردهای هم گروهی های خود را می شمارد - بعلاوه 1 عدد شماره آی دی گروه خود می شود - رکورد خود را اضافه می کند - قفل جدول را باز می کند

مشکل : یوزر دیگری وارد شده و جدول قفل است و عملیات نمی تواند انجام دهد و عملیات متوقف شده ! یوزر باید دوباره روی دکمه ثبت کلیک کند و درخواست انجام عملیات دوباره فرستاده شود؟؟؟
لطفا حرفه ای ها و با تجربه ها یاری کنند

MMSHFE
یک شنبه 15 تیر 1393, 10:46 صبح
خیر کاربر نیازی نیست دوباره دکمه ثبت رو بزنه بلکه درخواستهای MySQL اون، منتظر میشن تا کار این کاربر تمام بشه و قفل رو آزاد کنه و بعد، انجام میشه.

Veteran
یک شنبه 15 تیر 1393, 10:57 صبح
بله،همونطور که اقای شهرکی گفتند، این عملیات سمت پایگاه مدیریت میشه.
کاربر کلیک میکنه و کد پردازش میشه و میره سمت پایگاه.اگر جدول باز باشه که هیچ، در غیر این صورت در خوده مای اس کیو ال مدیریت میشه و در صف پردازش قرار میگیره!

amg_123
یک شنبه 15 تیر 1393, 20:19 عصر
سلام
میتونی max جدول رو بگیری وبعد id=max+1 بشه. اگه procedure واسش بنویسی که چه بهتر.

select max(id) from tb1 where group='a'