استخراج همزمان جدیدترین رکوردها از سه جدول

NabiKAZ

Well-Known Member
سلام .
یه سوال داشتم...

سه تا جدول به اسمهای table1 و table2 و table3 داریم.
فیلد های id و subject و date در هر سه مشترکه.
حالا میخواهیم از بین تمامی رکوردهای هر سه جدول ، 5 تا از جدیدترین رکوردها رو استخراج کنیم.
جدید ترین رکوردها از روی فیلد data جداول که مشترک هستند مشخص میشه.

به عبارت دیگه کاری که باید صورت بگیره اینه که رکورد های هر سه جدول باید روی هم ریخته بشه و سپس بر اساس date همه رکوردها سورت بشن ، سپس 5 تای اول نمایش داده بشن.

ممنون
نبی
 

tabib_m

Member
سلام
ببین این جواب نمیده؟
کد:
select `table1`.`id` as 'table1_id' , `table1`.`subject` as 'table1_subject' , `table1`.`date` as 'table1_date' , `table2`.`id` as 'table2_id' , `table2`.`subject` as 'table2_subject' , `table2`.`date` as 'table2_date' , `table3`.`id` as 'table3_id' , `table3`.`subject` as 'table3_subject' , `table3`.`date` as 'table3_date' ,  order by `table1_date` desc , `table2_date` desc , `table3.date` desc limit 5
 

NabiKAZ

Well-Known Member
سلام طبیب جان؛

از کدت ممنون البته به لحاظ ساختاری و دستوری یکمی مشکل داشت که این درستشه:
کد:
select `table1`.`id` as 'table1_id' , `table1`.`subject` as 'table1_subject' , `table1`.`date` as 'table1_date' , `table2`.`id` as 'table2_id' , `table2`.`subject` as 'table2_subject' , `table2`.`date` as 'table2_date' , `table3`.`id` as 'table3_id' , `table3`.`subject` as 'table3_subject' , `table3`.`date` as 'table3_date'  FROM `table1`,`table2`,`table3`  order by `table1_date` desc , `table2_date` desc , `table3_date` desc limit 5

اما با این وجود نتیجش یکمی عجیب بود ! و اون چیزی نبود که میخواستم !


منتظر راهنمایی دوستان هستم.

ممنون
نبی
 

tabib_m

Member
شرمنده به خاطر اشتباهی که کردم... , حدود نیم ساعت بعد از ارسال متوجه اشتباهم شدم ولی وقت نکردم درستش کنم :)

فکر کنم مجبور باشی یک تیبل چهارم بسازی و ... خودت میدونی دیگه.

در کل اگه فکری به ذهنم رسید میگم.

اگر خودت تونستی درستش کنی ممنون میشم اینجا هم بگی.

موفق باشید
 

NabiKAZ

Well-Known Member
سلام ،
اوه! تیبل چهارم !
چرا به ذهن خودم نرسید.
هر تیبل رو sort میکنیم 5 تا رکورد آخر هر تیبل رو تو یه تیبل جدید insert میکنیم.
بعد تیبل جدید رو sort میکنم و 5 تای جدید رو میکشیم بیرون.
در حال حاظر کارم رو راه میندازه ، اگر راه بهتری پیدا کردم جایگزین میکنم.

البته خیلی سعی کردم از آرایه ها استفاده کنم و توابع asort و arsort ، ولی نتیجه نگرفتم.

دوستان کسی راه بهتری داشت ممنون میشم راهنمایی کنه . (سرنخ کافیست!)

بازم ممنون
نبی
 

ziXet

مدیر انجمن PHP/MYSQL
به نظر من راحت ترین راش اینه که از هر تیبل 5 تا انتخاب کنی و همشونو بریزی تو یه آرایه بعد آرایه رو sort کنی!
 

NabiKAZ

Well-Known Member
به نظر من راحت ترین راش اینه که از هر تیبل 5 تا انتخاب کنی و همشونو بریزی تو یه آرایه بعد آرایه رو sort کنی!

این راحت ترین راه نیست ولی شاید بهترین راه باشه !
من اولین بار سعی کردم همچین کاری کنم ولی به اون سادگی هم که فکر میکردم نبود. به خاطر اینکه 3 تا فیلد هستند که به هم مربوط هستند و زمان سورت کردن به مشکل برخورد کردم.!
شما سعی کن اگر موفق شدید سورس رو هم بزارید ممنون میشم.

تشکر
نبی
 

tabib_m

Member
خوب شما این کار رو بکن.
اول اینجوری بریز تو آرایه :
کد:
$a=array(
    $table1.'-'.$id1=>'$date1' ,
    $table1.'-'.$id2=>'$date2' ,
    $table1.'-'.$id3=>'$date3' ,
    $table1.'-'.$id4=>'$date4' ,
    $table1.'-'.$id5=>'$date5' ,
    $table2.'-'.$id6=>'$date6' ,
    $table2.'-'.$id7=>'$date7' ,
    $table2.'-'.$id8=>'$date8' ,
    $table2.'-'.$id9=>'$date9' ,
    $table2.'-'.$id10=>'$date10' ,
    $table3.'-'.$id11=>'$date11' ,
    $table3.'-'.$id12=>'$date12' ,
    $table3.'-'.$id13=>'$date13' ,
    $table3.'-'.$id14=>'$date14' ,
    $table3.'-'.$id15=>'$date15' ,
);

بعد سورتش کن
و بعد هم اندیس پنج خونه ی اول رو برداد ( در حقیقت آی دی ها و تیبل های مربوطه ی رکوردهای مورد نظر ) و بعد هم رکوردهای لازم رو از تو دیتابیس در بیار تا فیلدهای دیگه رو هم داشته باشی.

(خورده کاریهاش رو دیگه خودت بلدی)

اگه نیاز به توضیح بیشتر بود بگو
امیدوارم به دردت بخوره

موفق باشید
 

NabiKAZ

Well-Known Member
ممنون طبیب جان
الان مخم هنگه ! از دیشب نخوابیدم
روش کار میکنم نتیجه رو میگم
زحمت کشیدی
[این پست باید دیروز ارسال میشد ولی نمیدونم چرا الان داره میاد !!!]
 

NabiKAZ

Well-Known Member
سلام ؛

tabib_m و Shahkey.com از راهنماییتون ممنون .
با سرنخ های شما مشکل رو حل کردم .
اینم کدی که نوشتم:

PHP:
$n=1;
$query = "SELECT * FROM `table_jobs` ORDER BY `date` DESC LIMIT 5";
$result = mysql_query($query);
while ($r = mysql_fetch_array($result)) {
			${"id".$n} = $r['id'];
			${"item".$n} = $r['item2'];
			${"date".$n} = $r['date'];
			$n++;
}

$n=6;
$query = "SELECT * FROM `table_industry` ORDER BY `date` DESC LIMIT 5";
$result = mysql_query($query);
while ($r = mysql_fetch_array($result)) {
			${"id".$n} = $r['id'];
			${"item".$n} = $r['item2'];
			${"date".$n} = $r['date'];
			$n++;
}

$n=11;
$query = "SELECT * FROM `table_interoffice` ORDER BY `date` DESC LIMIT 5";
$result = mysql_query($query);
while ($r = mysql_fetch_array($result)) {
			${"id".$n} = $r['id'];
			${"item".$n} = $r['item2'];
			${"date".$n} = $r['date'];
			$n++;
}

for ($i=1; $i<=15; $i++){
if (${"date".$i}) $a[${"date".$i}] = ${"id".$i} . "#" . ${"item".$i};
}

krsort($a);
reset($a);

for ($i=1; $i<=5; $i++) {
    $line = each($a);
    $date = $line[key];
    list($id, $item) = split('#', $line[value]);
    print $date . " - " . $id . " - " . $item . "<BR>\n";
}

بازم ممنونم از شما دوستان خوب

نبی
 
آخرین ویرایش:

NabiKAZ

Well-Known Member
کدی که در بالا نوشتم ، یه ایرادی که داره اینه که از اونجا که تاریخ به عنوان اندیس به کار رفته ، اونوقت اگر دو تاریخ یکسان وجود داشته باشه ممکنه اشکالاتی پیش بیاد که البته خیلی نادره ! و ایراد دیگه شاید این باشه که از اونجا که در ابتدا اطلاعات به یکدیگر چسبانده میشن و در نهایت جداسازی میشن ، اگر اطلاعات زیاد باشن شاید کمی مشکل ساز بشه ... و....
ولی با روش دیگه تقریبا تموم مشکلات رو حل کردم ، این راه تقریبا به سرنخی که طبیب در پست آخرش داد نزدیک تره و شاید بهتر جواب بده :
PHP:
$query = "SELECT * FROM `table_jobs` ORDER BY `date` DESC LIMIT 5";
$result = mysql_query($query);
while ($r = mysql_fetch_array($result)) {
			$a["table_jobs-".$r[id]] = $r['date'];
}

$query = "SELECT * FROM `table_industry` ORDER BY `date` DESC LIMIT 5";
$result = mysql_query($query);
while ($r = mysql_fetch_array($result)) {
			$a["table_industry-".$r[id]] = $r['date'];
}

$query = "SELECT * FROM `table_interoffice` ORDER BY `date` DESC LIMIT 5";
$result = mysql_query($query);
while ($r = mysql_fetch_array($result)) {
			$a["table_interoffice-".$r[id]] = $r['date'];
}

arsort($a);
reset($a);

for ($i=1; $i<=5; $i++) {
    $line = each($a);
    list($table, $id) = split('-', $line[key]);
    $query = "SELECT * FROM `$table` WHERE `id`='$id'";
    $result = mysql_query($query);
		list($id, $item1, $item2, $item3, $date) = mysql_fetch_array($result);
    print $id . " - " . $date . " - " . $item1 . " - " . $item2 . " - " . $item3 . "<BR>\n";
}

تشکر
نبی
 

tabib_m

Member
اگه اس کیو الی که انداختی تو حلقه رو یکیش میکردی بهتر نبود؟

کد:
$ids=$id1.",".$id2.",".$id3.",".$id4.",".$id5
////
select * from `tableName` where `id` in ($ids)
 

overcrash

Active Member
میشه یکم به تواناییها و شکلهای sql دقت کنید و اینکارو با یک کوئری انجام بدید؟
(الان وقت ندارم اما حیفه که اینکارو نکنید - البته اگه علاقه دارید- )
اگه نتیجه گرفتید اینجا هم بنویسید
ممنون
 

NabiKAZ

Well-Known Member
اگه اس کیو الی که انداختی تو حلقه رو یکیش میکردی بهتر نبود؟

کد:
$ids=$id1.",".$id2.",".$id3.",".$id4.",".$id5
////
select * from `tableName` where `id` in ($ids)

اول اعتراف میکنم اینو نمیدونستم ! آخه با همون دستورات محدودی که بلدم کارم راه افتاده !

اما فکر کنم اینی که شما گفتی جواب نده !
چون اگر دقت کنی هر بار که each اجرا میشه ، table و id با هم به query فرستاده میشن و یعنی table و id در ارتباط با هم هستند ، و id در یه table دیگه رکورد دیگری برمیگردونه ! ولی query که شما معرفی کردی ، تمام id ها رو درسته همزمان چک میکنه ، ولی در یک table !
فکر میکنم چون هر id و table به هم مربوطن باید هر بار جداگونه رکوردشون استخراج بشه .
امیدوارم اشتباه نکرده باشم و تونسته باشم منظورم رو برسونم .

بازم ممنون
نبی
 

NabiKAZ

Well-Known Member
میشه یکم به تواناییها و شکلهای sql دقت کنید و اینکارو با یک کوئری انجام بدید؟
(الان وقت ندارم اما حیفه که اینکارو نکنید - البته اگه علاقه دارید- )
اگه نتیجه گرفتید اینجا هم بنویسید
ممنون

دوست من !
مطمئنا به توانایی های sql شک ندارم ! ولی به توانایی های خودم شک دارم !!!
ما که بیشتر از این زورمون نرسید ! شما میتونی بسم اله ! دعاتم میکنیم !

چاکریم
نبی
 

جدیدترین ارسال ها

بالا