PDA

View Full Version : مبتدی: بدست آوردن شماره رکورد در یک کوئری



iner30
چهارشنبه 12 بهمن 1390, 19:42 عصر
سلام خدمت دوستان
دارم کد گالری عکس مینویسم ، یه سوال واسم ایجاد شده
فرض کنید عکس ها براساس یک آیتم خاص orderd by شدن ، حالا من از بین اینا یه عکسو با دستور where میکشم بیرون ، حالا چه جوری بفهمم این عکس چندمین عکس تو این کوئری بوده تا بتونم عکس قبلی و بعدیش رو هم نمایش بدم...
امیداورم خوب تونسته باشم مفهموممو برسونم

wallfa
چهارشنبه 12 بهمن 1390, 19:46 عصر
عزیز ، اول بعد از گرفتن کوئری با دستور mysql_fetch_array همه اطلاعات که از دیتابیش مخصوص اون عکس بگیر ، بعد حالا یه شناسه داری داخل دیتابیس بعد دستور بده که این شناسه میخواهی و بعد یکی از اون کم کن و در آخر برای نمایش نتایج بهش بگو از فلان شماره تا سه شماره بعد نشونت بده (منظورم داخل حلقه است )

iner30
چهارشنبه 12 بهمن 1390, 20:17 عصر
بعد دستور بده که این شناسه میخواهی و بعد یکی از اون کم کن و در آخر برای نمایش نتایج بهش بگو از فلان شماره تا سه شماره بعد نشونت بده (منظورم داخل حلقه است )

مشکل منم همین جاست، چه جوری شناسه اون عکسو بش بدم؟؟
ببینید دوست عزیز همه عکسا در یک جدول لیست شدن ، و هر سری بر اساس یک چیزی مرتب میشن ، پس همیشه یک ترتیب نیستن

مثلا 3 تا عکس هست با بازدیدهای 97 و 100 و 112
حالا من عکس با بازدید 100 رو نمایش میدم ، چه جوری بفهمم قبلش 97 و بعدش 112 هستن؟

wallfa
چهارشنبه 12 بهمن 1390, 20:29 عصر
عزیز این طورش من نمیدونم ، اما اصولا اینطور مسائل قائده داره ، از فرمول ریاضی بهش میرسی !

wallfa
چهارشنبه 12 بهمن 1390, 21:02 عصر
دوست عزیز من اینطور یه راه حلی دادم نمیدونم دقیقا درست باشه از لحاظ برنامه نویسی یا نه اما فکر میکنم کار تو حل کنه !


$b=15;
$c=4;
for($i=$b;$i>0;$i--){
if($i==(int)$c){
$d=$i;
break;
}
}
echo $d;



خوب اول ما اون عدد مورد نظر داریم
دوم یه حلقه میذاریم که شروع کنه تا صفر یکی یکی از این حلقه شماره کم کنه
سوم یه شرط داریم که هر وقت عدد بدست آمده با یکی از اعداد دیتابیس اون فیلد مورد نظر برابر بود اون بریزه داخل متغییر d و از حلقه خارج بشه
چهارم ما میدونیم که اسکیوال میتونه تمام فیلد ها به ترتیب میزون کنه ، حالا باید بهش بگیم که از اون سطر مورد نظر تا سه سطر بعدش برامون فراخوانی کنه
اگر این کار نکردیم همین حلقه بر عکس مینویسم !

mohsen24000
چهارشنبه 12 بهمن 1390, 21:32 عصر
از این روش استفاده کن:


SELECT *,@rownum := @rownum + 1 AS row FROM `table`,(SELECT @rownum := 0) r

در اینجا به نتیجه کوئری شما یک فیلد row اضافه میشه که ترتیب قرار گرفتن رکوردها با هر سورتی مشخص شده.
حالا فرضا فیلد row رکوردی که نمایش میدهید 20 باشه اونوقت رکوردهایی رو select کنید که دارای row+1 و row-1 باشند.

iner30
پنج شنبه 13 بهمن 1390, 10:27 صبح
محسن شما این کدی که دادی برای sql هست؟
من از mysql استفاده میکنم ، تا جایی که تونستم کد رو تغییر دادم ولی ارور میده....

mohsen24000
پنج شنبه 13 بهمن 1390, 14:11 عصر
این کوئری که نوشتم دقیقا در mySql تست شده و جواب میده، در اینصورت نباید مشکلی داشته باشید.

iner30
پنج شنبه 13 بهمن 1390, 20:00 عصر
محسن میشه بیشتر توضیح بدی؟

$pic_data_show=mysql_query("select * from file where file_id=$pic_id");

این کد من واسه نمایش یک عکسه ، حالا چه جوری قبل و بعدش رو بفهمم
من از کودت استفاده کردم ، ولی دقیقا نفهمیدم چه طوری باید تغییرش بدم!!!!

mbf5923
پنج شنبه 13 بهمن 1390, 20:56 عصر
این رو تست بزنید:
کوچکتر:

$pic_data_show=mysql_query("select * from file where file_id<$pic_id ORDER BY file_id DESC LIMIT 1");
بزرگتر:

$pic_data_show=mysql_query("select * from file where file_id>$pic_id ORDER BY file_id ASC LIMIT 1");
برای بزرگتر این هم باید جواب بده:

$pic_data_show=mysql_query("select * from file where file_id LIMIT $pic_id,1");

mohsen24000
پنج شنبه 13 بهمن 1390, 21:30 عصر
این رو تست بزنید:
کوچکتر:

$pic_data_show=mysql_query("select * from file where file_id<$pic_id ORDER BY file_id DESC LIMIT 1");بزرگتر:

$pic_data_show=mysql_query("select * from file where file_id>$pic_id ORDER BY file_id ASC LIMIT 1");برای بزرگتر این هم باید جواب بده:

$pic_data_show=mysql_query("select * from file where file_id LIMIT $pic_id,1");
دوست من شما گویا سوال ایشون رو خوب متوجه نشدید!؟
نتایج کوئری که iner30 مدنظرشه لزوما براساس فیلد pic_id مرتب نیست! به عبارتی ممکنه فیلد pic_id در نتیجه کوئری دارای gap و نامرتب باشد...


$pic_data_show=mysql_query("select *,@rownum := @rownum + 1 AS row from file,(SELECT @rownum := 0) r where file_id=$pic_id order by name");
برای مثال:
pic_id name row
5 pic1 1
10 pic2 2
3 pic3 3

حالا فرض کنیم که تصویر موردنظر pic2 باشه که pic_id اون 10 است در اینجا pic_id تصاویر قبل و بعد مرتب نیست. حال با داشتن row تصویر مورد نظر میتونیم به pic_id های row قبلی و بعدی یعنی pic_idهای 5 و 3 دسترسی داشته باشیم و اونها رو نمایش بدیم.

iner30
پنج شنبه 13 بهمن 1390, 21:34 عصر
نه جواب نمیده
این نکته رو تو پست های قبل هم گفتم ، هر سری عکسها براساس یک آیتم مرتب سازی میشن ، بنابراین همیشه آیدی عکس بزرگتر از عکس قبلیش نیست...

mbf5923
پنج شنبه 13 بهمن 1390, 22:20 عصر
من کد رو بر اساس کدی که گذاشته بودین گذاشتم

iner30
پنج شنبه 13 بهمن 1390, 22:50 عصر
خیلی خیلی ممنون محسن جان
با این تونستم درستش کنم ، ولی آخرم مجبور شدم دو تا دستور sql بنویسم ، با یکی شمارشو بدست بیارم با یکی قبلیشو چاپ کنم....