برگزیده های پرشین تولز

انتخاب نتايج مشترك در دو select كه توسط mysql انجام شده است

al_frd

Registered User
تاریخ عضویت
18 دسامبر 2002
نوشته‌ها
318
لایک‌ها
5
سلام
فرض كنيد كه با دستور select دو سري خروجي از Mysql داريد .
حالا چطور ميشه خروجي هاي مشترك بين اونها را به عنوان خروجي نهايي استخراج كرد ؟

مثلا دستور union ميتونه دو سري خروجي رو به هم وصل كنه (درسته ؟) ، آيا دستور هست كه خروجي هاي مشترك رو گزارش كنه ؟
 

knowhow

مدیران قدیمی
تاریخ عضویت
25 دسامبر 2002
نوشته‌ها
3,478
لایک‌ها
22
دستوري فكر نمي كنم باشه كه بعد از select زدن این کار رو بکنه.
ولی اگه بخوای می شه در هنگام select زدن مقادیری رو select کنی که مثلا فلان فیلدشون با هم برابر باشه.
اگه خواستی بگو تا من دستورش رو برات پیدا کنم.
 

al_frd

Registered User
تاریخ عضویت
18 دسامبر 2002
نوشته‌ها
318
لایک‌ها
5
خيلي ممنون
بهتره من هدف اصليم رو بگم . كه زودتر به نتيجه برسم . من مي خوام يه قسمت براي جستجو درست كنم كه وقتي كاربر مثلا سه تا لغت رو search مي كنه نتيجه اش رديفي باشه كه هر سه تا لغت توش باشه ( تعداد لغات قابل تغيير باشه يعني ممكنه كاربر 5 تا لغت بزنه ) . حالا توي هر ستوني بود اهميتي نداره ، فقط سطر هايي رو پيدا كنه كه هر سه تا لغت توش رو باشه .( مثل وقتي كه شما توي گوگل با "+" جستجو مي كنيد )
تا حالا پنج تا راه به نظرم رسيده ولي نمي دونم كدومش عملي و درست هست .
1- استفاده از روشي كه بالا گفتم ، يعني به تعداد لغات select انجام بشه ، بعد اشتراك نتيجه ي select ها گزارش بشه
2- استفاده از يه select كه جلوي قسمت where بشه يه حلقه تعريف كرد (مثلا با while) كه عمل where روي خروجي هاي حلقه انجام بشه .
3- استفاده از دو تا table كمكي كه رديفهايي كه اولين لغت توش هست رو select كنه و بريزه توي table1 .
بعد select براي لغت دوم از table1 انجام بشه و نتيجه اش بره تو table2 . دوباره select براي لغت سوم توي table2انجام بشه و نتيجه اش بره توي table1 و ... همه لغتها كه تموم شدن محتواي آخرين جدول كه ورودي داشته رو گزارش كنه .
4- يه table كمكي بسازيم دقيقا مثل table اصلي . از لغت اول شروع كنيم توي هر رديفي كه نبود ، اون رديف حذف بشه . همين كار رو براي لغت دوم و ... هم انجام بديم . جدول نهايي ميشه جواب ما ...
5- استفاده از Boolean Full-Text Searches مثل :
کد:
SELECT * FROM table WHERE MATCH (... , ... , ...) AGAINST ('+word1 +word2' IN BOOLEAN MODE);
باز هم بايد توي قسمت AGAINST يه حلقه تعريف كرد كه +word ها نتيجه اون باشه

فكر ميكنم راه حلهاي مسخره اي باشه ولي ديگه نمي دونم چي كار كنم . اصلا نمي دونم كدوم يكي از اينها شدني هست . لطفا راهنمائيم كنيد :blush:

اگه برنامه اي ميشناسين كه اين كار رو بكنه ممنون ميشم معرفي اش كنيد . :)
( مي خواستم از search برنامه هايي مثل Phpbb يا VB استفاده كنم و راه اونها رو پيدا كنم اما آدم سراغ اونها نره بهتره :wacko: )
 

knowhow

مدیران قدیمی
تاریخ عضویت
25 دسامبر 2002
نوشته‌ها
3,478
لایک‌ها
22
خوب راحت ترین راه اینه که همون select معمولی بزنی و توش حلقه بدی. یعنی اینطوری :

PHP:
$sql = "select * from table where ";

//inja har halgheyi mikhay bezar 

for ($i = 1; $i <= 10; $i++) { 

if ($name[$i] != '') {
$sql .= "`row` like '%$serachkeyword%' " ;
}

} 

$query = mysql_query($sql) ;
خوب این باید کارت رو راه بندازه.
اول میای تیکه ابتدای query رو می نویسی و بعد یه حلقه می زنی و بعد هم تمام.
این بهترین راه حل است.
 

al_frd

Registered User
تاریخ عضویت
18 دسامبر 2002
نوشته‌ها
318
لایک‌ها
5
خيلي ممنون .
مشكل حل شد . در ضمن كلي چيز ياد گرفتم .
مرسي
 

aaber_piade

Registered User
تاریخ عضویت
19 دسامبر 2002
نوشته‌ها
1,660
لایک‌ها
25
سن
40
محل سکونت
Tehran
دوستان اين مدل ظاهر شدن كدها در استايل كرم مشكل داره يه قدري.. روي blue درست کار ميکنه.
 

choop342

کاربر تازه وارد
تاریخ عضویت
13 جولای 2004
نوشته‌ها
2
لایک‌ها
0
اين دستورات رو كار كن
select $tablename1.$fild1 FROM $tablename1 INNER JOIN $tablename1 ON $tablename1.$fild1 = $tablename2.$fild2
بعدش ما رو هم دعا كن
 

al_frd

Registered User
تاریخ عضویت
18 دسامبر 2002
نوشته‌ها
318
لایک‌ها
5
به نقل از choop342 :
اين دستورات رو كار كن
select $tablename1.$fild1 FROM $tablename1 INNER JOIN $tablename1 ON $tablename1.$fild1 = $tablename2.$fild2
بعدش ما رو هم دعا كن

سلام
هنوز امتحان نكردم ( آخه با روشي كه knowhow گفته بودند مشكلم حل شد )
ولي دستتون درد نكنه . همين كه لطف كردين و راه حلي كه نظرتون رسيد رو گفتين جاي تشكر فراوان داره .
اميدوارم در حل مشكلات بعديم كمكم كنيد . ( آخه من يه تازه كارم ... ;) )
 
بالا