همفکری برای نوشتن یه کوئری

ziXet

مدیر انجمن PHP/MYSQL
سلام

من یه تیبل کتگوری دارم و یه تیبل entry دارم هر entry با یه فیلد به کتگوری مورد نظر لینک شده.
حالا من میخوام یه کوئری بنویسم که از مثلا 5 اینتری از هر کتگوری انتخاب کنه.

فقط میخوام یه کوئری باشه.


ممنون
 

ziXet

مدیر انجمن PHP/MYSQL
دوستان یه حالی بدن بد نیست!

اگه سوالو متوجه نشدید بگید بهتر توضیح بدم
 

parsiteam

Member
برای ساخت موضوعات به صورت درختی میخوای ؟ اگر آره یا همیچین چیزی بگو عزیزم تا یک راهی که خودم استفاده کردم رو بگم .
 
آخرین ویرایش:

ziXet

مدیر انجمن PHP/MYSQL
سوالت واضح نیست.
لطفاً بیشتر توضیح و اطلاعات بده
ببین فرض کن من 5 تا کتگوری دارم و تو هر کتگوری 10 تا مطلب هست.

خب من میخوام از هر کتگوری 5 تا مطلب رو چاپ کنم.

مثلا اینطوری:
cat1:
entry1
entry2
entry3
entry4
entry5
cat2:
entry1
entry2
entry3
entry4
entry5
.
.
.
 

ziXet

مدیر انجمن PHP/MYSQL
حداقل اگه نمیشه بگید یه فکر دیگه بکنم!!!
 

parsiteam

Member
سلام . این روش کاره . اگر یک تیبل بنام cats برای موضوعات و یک تیبل بنام entries برای مقالاتت داشته باشی با دستورات زیر میتونی به هدفت برسی . موفق باشی داداشی .

PHP:
$AllCats_Q = mysql_query("SELECT * FROM cats", $connection) or die(mysql_error());
$AllCats = mysql_fetch_assoc($AllCats_Q);

do {
	
	$LastNews_Q = mysql_query("SELECT * FROM entries WHERE cat='".$AllCats['id']."' LIMIT 5", $connection) or die(mysql_error());
	$LastNews = mysql_fetch_assoc($LastNews_Q);
	do {
		echo $LastNews['title'];
	} while ($LastNews = mysql_fetch_assoc($LastNews_Q));
	
} while ($AllCats = mysql_fetch_assoc($AllCats_Q));
 

ziXet

مدیر انجمن PHP/MYSQL
سلام

ممنون از اینکه وقت گذاشتی!

ولی من چون دیتابیسم خیلی خیلی بزرگ هست نمیتونم چندتا mysql_query بگیرم! میخواستم ببینم که میشه این کارو با یه کوئری کرد؟

ظاهرا که نمیشه!
 

parsiteam

Member
خواهش میکنم . وظیفه بود . ولی میشه بپرسم مگر اجرای تعداد زیاد کوئری چه مشکلی داره ؟ تا جایی که من میدونم سرعت کار با پایگاه داده خیلی بالاست . پس مشکل سرعت نباید باشه . بعدشن حالا اگر 2 ثانیه بشه 3 ثانیه آسمون به زمین که نمیاد .
 

ziXet

مدیر انجمن PHP/MYSQL
خواهش میکنم . وظیفه بود . ولی میشه بپرسم مگر اجرای تعداد زیاد کوئری چه مشکلی داره ؟ تا جایی که من میدونم سرعت کار با پایگاه داده خیلی بالاست . پس مشکل سرعت نباید باشه . بعدشن حالا اگر 2 ثانیه بشه 3 ثانیه آسمون به زمین که نمیاد .
اون روش رو امتحان کرده بودم!

خیلی زمانیش زیاد میشد

چون seek رو بر اساس LIKE انجام میده زمان زیاد میشه
 

I.NoBody

Active Member
ببخشید که دیر جواب دادم.
مسافرت بودم.
shahkey شما با 2 کوئری باید حلش کنی.
در کوئری اول شناسه کتگوری ها رو بگیر.
در کوئری دوم با استفاده از UNION و شناسه هر کتگوری، می تونی entry ها رو بگیری.
مثلاً:
PHP:
$qry="SELECT id FROM categories";
$result=mysql_query($qry);
$i=0;
while($row = mysql_fetch_assoc($result)){
	$cat[$i]=$row['id'];
	$i++;
}
unset($result);
unset($qry);
$qry="";
for($i=0;$i<sizeof($cat);$i++){
	$qry.="(SELECT * FROM entry WHERE cat_id='{$cat[$i]}' LIMIT 0,10) UNION ";
}
$qry=substr($qry,0,-7);
$result=mysql_query($qry);
این کد رو با عجله همینجا نوشتم. امیدوارم خطا نداشته باشه
 
آخرین ویرایش:

ziXet

مدیر انجمن PHP/MYSQL
سلام

تستش کردم خیلی خوب کار میکرد ولی هنوز یخیلی کند هست!
تو این حالت حدود 8 ثانیه زمانش زیادتر شد !
اگه تعداد کتگوری ها هم بیشتر بشه این زمان خیلی زیاد تر میشه!

نمیشه اینو کوچیکترش کرد؟
 

I.NoBody

Active Member
سلام

تستش کردم خیلی خوب کار میکرد ولی هنوز یخیلی کند هست!
تو این حالت حدود 8 ثانیه زمانش زیادتر شد !
اگه تعداد کتگوری ها هم بیشتر بشه این زمان خیلی زیاد تر میشه!

نمیشه اینو کوچیکترش کرد؟
8 ثانیه؟!!!!!!!!!!!!!!!
بعید میدونم.
یه تجدید نظری بکن.
مگه چند تا کتگوری داری؟
این کوئری تا چند ده کتگوری هم که داشته باشی، باید سریع کار کنه.
شما یه بار 10 تا رکورد یک کتگوری رو بدون UNION از دیتابیس fetch کن، ببین چقدر زمان میبره، بعدش اینو تست کن، بعد تفاوتشون رو حساب کن.
اگر واقعاً در هر دو حالت، اینقدر زمانبر هست، مشکل از جای دیگه است
 

ziXet

مدیر انجمن PHP/MYSQL
8 ثانیه؟!!!!!!!!!!!!!!!
بعید میدونم.
یه تجدید نظری بکن.
مگه چند تا کتگوری داری؟
این کوئری تا چند ده کتگوری هم که داشته باشی، باید سریع کار کنه.
شما یه بار 10 تا رکورد یک کتگوری رو بدون union از دیتابیس fetch کن، ببین چقدر زمان میبره، بعدش اینو تست کن، بعد تفاوتشون رو حساب کن.
اگر واقعاً در هر دو حالت، اینقدر زمانبر هست، مشکل از جای دیگه است
تو اون حالت که صالا هنگ میکنه!!
ببین من علاوه بر اون یه like هم تو کوئری دارم! ولی اگه like رو هم حذف کنم تفاوتش 2 ثاینه میشه!
البته دیتابیسم خیلی بزرگ هست! حدود500000 تا رکورد توش هست
 

yakoza

Well-Known Member
من با اجازه I,NoBody کدشو یخورده تغییر دادم
البته تست نکردم احتمال خطا وجود داره

PHP:
<?php
function fetch_arr($sql)
{
	$res=mysql_query($sql);
	while($row=mysql_fetch_assoc($res))
	{
		$rows[]=$row;
	}	
	mysql_free_result($res);
	return $rows;
}
$qry="SELECT id FROM categories";
$result=mysql_query($qry);
$i=0;
while($row = mysql_fetch_assoc($result)){
    $cat[]=$row['id'];
}
unset($result,$qry);
$count=count($cat);
for($i=0;$i<$count;$i++){
    $qry="SELECT * FROM entry WHERE cat_id='{$cat[$i]}' LIMIT 0,10";
    $rows[]=fetch_arr($qry);
}

echo "<pre>";
print_r($rows);
?>

تست کن ، جوابشو بده
 

ziXet

مدیر انجمن PHP/MYSQL
من با اجازه I,NoBody کدشو یخورده تغییر دادم
البته تست نکردم احتمال خطا وجود داره

PHP:
<?php
function fetch_arr($sql)
{
	$res=mysql_query($sql);
	while($row=mysql_fetch_assoc($res))
	{
		$rows[]=$row;
	}	
	mysql_free_result($res);
	return $rows;
}
$qry="SELECT id FROM categories";
$result=mysql_query($qry);
$i=0;
while($row = mysql_fetch_assoc($result)){
    $cat[]=$row['id'];
}
unset($result,$qry);
$count=count($cat);
for($i=0;$i<$count;$i++){
    $qry="SELECT * FROM entry WHERE cat_id='{$cat[$i]}' LIMIT 0,10";
    $rows[]=fetch_arr($qry);
}

echo "<pre>";
print_r($rows);
?>

تست کن ، جوابشو بده
سلام

ببین این روش که با حلقه کوئری جدید میگیری رو امتحان کرده بودم! اون روشی که Inobody گفت فقط دوتا کوئری گرفته میشه که کوئری دومش خیلی سنگین هست.
 

ziXet

مدیر انجمن PHP/MYSQL
8 ثانیه؟!!!!!!!!!!!!!!!
بعید میدونم.
یه تجدید نظری بکن.
مگه چند تا کتگوری داری؟
این کوئری تا چند ده کتگوری هم که داشته باشی، باید سریع کار کنه.
شما یه بار 10 تا رکورد یک کتگوری رو بدون UNION از دیتابیس fetch کن، ببین چقدر زمان میبره، بعدش اینو تست کن، بعد تفاوتشون رو حساب کن.
اگر واقعاً در هر دو حالت، اینقدر زمانبر هست، مشکل از جای دیگه است
راستی تعداد کتگوری ها شاید ده تا هم نشه!
اون entryها زیاد هست! 500 هزارتا به بالا
 

I.NoBody

Active Member
راستی تعداد کتگوری ها شاید ده تا هم نشه!
اون entryها زیاد هست! 500 هزارتا به بالا
شما با ديتابيس قدرتمندي به نام MySQL داري كار ميكني. مي توني بهتر از اينها جواب بگيري.
آيا طراحي ديتابيست ايرادي نداره؟
تيبلت رو Optimize كردي؟
فيلدهايي رو كه روشون كوئري ميزني، index كردي؟
اطلاعات توي ديتابست رو بطور عادي ميريزي، يا انكدينگ شده ميريزي؟
و چند بررسي ديگه . . .
 

I.NoBody

Active Member
تو اون حالت که صالا هنگ میکنه!!
ببین من علاوه بر اون یه like هم تو کوئری دارم! ولی اگه like رو هم حذف کنم تفاوتش 2 ثاینه میشه!
البته دیتابیسم خیلی بزرگ هست! حدود500000 تا رکورد توش هست
در كدوم حالت هنگ ميكنه؟
ببين منظور من اينه :
مثلاً
PHP:
$qry.="SELECT * FROM entry WHERE cat_id='4' LIMIT 0,10";

$result=mysql_query($qry);

در اين حالت ببين چقدر زمان ميبره؟
يعني يك كوئري خيلي ساده براي اطلاعات مربوط به يك كتگوري فقط
 

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

بالا