PDA

View Full Version : query در MYSQL



Weblove
چهارشنبه 23 مهر 1393, 05:08 صبح
سلام
من یک جدول محصولات دارم و یک جدول پارامتر
پارامتر هایی که با productid متصل شده اند به جدول محصولات
می خوام جستجوی پیشرفته ای روی اون قرار بدم

می خوام مثلا :

محصولاتی را که corei3 هستند و رنگ آبی دارند رو برام پیدا کنه


+-----------+-------------+-------------+
| productid | parameterid | data |
+-----------+-------------+-------------+
| 28 | 6 | sss |
| 28 | 8 | corei3 |
| 28 | 45 | blue |
| 29 | 6 | ddddddd |
| 29 | 8 | corei7 |
| 29 | 45 | red |
+-----------+-------------+-------------+

ممنون میشم اساتید راهنمایی کنند کوئری مربوطه به چه شکل میباشد ؟

desatir7316
چهارشنبه 23 مهر 1393, 07:45 صبح
محصولاتی را که corei3 هستند و رنگ آبی دارند رو برام پیدا کنه
توي data شما يا corei3 داريد يا رنگ blue

يا اطلاعاتتونو كامل نداديد اينجا يا اگه واقعا همينه كه نمي شه

nazanin_asadi_1
چهارشنبه 23 مهر 1393, 08:54 صبح
خب خیلی راحته
شما اول شرط ها رو اجرا میکنی بعد بر اساس productid گروه بندی میکنی و بعد از اون وصلش میکنی به جدول محصولات (البته این ساختارت یه خرده مورد داره)

SELECT * from tablemahsolat
INNER JOIN(

SELECT productid
from table1
WHERE data in ("blue","corei3")
GROUP BY productid

)ttable1 ON ttable1.productid=tablemahsolat.id


البته شرط های دیگه ای هم میتونی واسه این مورد بنویسی
WHERE
(parameterid=8 AND data="corei3")
AND
(parameterid=45 AND data="blue")


بهتره به جای این که در فیلد data رشته ذخیره کنید اونم تکراری (هر چه تعداد محصولات زیاد باشه تکرار هم زیاد میشه )
برای این منظور یه جدول دیگه درست کن و data ها رو به صورت منحصر به فرد اونجا ذخیره کن و ID اونها رو توی این جدولت بیار

Weblove
پنج شنبه 24 مهر 1393, 02:49 صبح
محصولاتی را که corei3 هستند و رنگ آبی دارند رو برام پیدا کنه

این مد نظرمه

خانم نازنین مورد اولی که شد همون يا
مورد دومتون هم که اونیه که من می خوام اما پاسخ بدون محتوا میده، به دلیل اینکه هم پارامتر 45 رو می خوام هم پارامتر 8 رو می خوام

اگه راهی بود همه پارامتر های مربوطه رو همزمان فراخوانی کنم بعد توش گزینش کنم این خوب میشد

nazanin_asadi_1
پنج شنبه 24 مهر 1393, 08:59 صبح
این ببین جواب میده
WHERE
`parameterid` in(8,45)
AND
`data` in("corei3","blue")

Weblove
پنج شنبه 24 مهر 1393, 16:59 عصر
ممنون از زحمتتون
اما نه متاسفانه، این یکی هم کل بلو ها رو میاره بالا ...


اگه راهی بود همه پارامتر های مربوطه رو همزمان فراخوانی کنم بعد توش گزینش کنم این خوب میشد
مثلا

select data[0],data[1] from parameters

bagherok
پنج شنبه 24 مهر 1393, 18:50 عصر
توي data شما يا corei3 داريد يا رنگ blue

يا اطلاعاتتونو كامل نداديد اينجا يا اگه واقعا همينه كه نمي شه
دوستمون درست میگن
اون تصویر جدول رو در نظر نمیگرم(فک میکنم اون جدول خروجی نهایی باشه .درسته؟)
و فرض میکنیم دو جدول دارید
جدول محصولات ( id | data )
جدول پارامتر (id)
و چیزی که شما میخوایید
data برابر با corei3 یا blue باشه
خروجی نهایی هم چیزی مثل این جدول

+-----------+-------------+-------------+
| productid | parameterid | data |
+-----------+-------------+-------------+
| 1 | 10 | corei3 |
| 5 | 12 | blue |
| 15 | 5 | corei3 |
| 11 | 22 | blue |
| 3 | 18 | blue |
+-----------+-------------+-------------+




select pd.id productid, pd.data, pm.id parametrid
from product pd
inner join parameter pm on pd.id = pm.id
where pd.data='corei3' OR pd.data='blue'

Weblove
پنج شنبه 24 مهر 1393, 19:10 عصر
ممنون از توجهتون اما
جدول همونه که توی پست اول دادم

شما فکر می کنید این جدول محصولات هست در صورتی که این جدول اطلاعات پارامتر ها هست !
یک محصول چند پارامتر داره و هر پارامتر یک دیتا

حالا من می خوام در محصولات بر اساس پارامتر های اون جستجو کنم


+-----------+-------------+-------------+
| productid | parameterid | data |
+-----------+-------------+-------------+
| 28 | 6 | sss |
| 28 | 8 | corei3 |
| 28 | 45 | blue |
| 29 | 6 | ddddddd |
| 29 | 8 | corei7 |
| 29 | 45 | red |
+-----------+-------------+-------------+

bagherok
پنج شنبه 24 مهر 1393, 19:22 عصر
خوب اگه اینطور باشه
یه جدول پارامتر داریم (تصویری که بالا هست)
و یه جدول محصولات


select pd.*
from product pd
inner join parameter pm on pd.id = pm.productid
where pm.data='corei3' OR pm.data='blue'

bagherok
پنج شنبه 24 مهر 1393, 20:52 عصر
select pd.*,pm.*
from product pd
inner join parameter pm on pd.id = pm.productid
where pm.data='corei3' OR pm.data='blue'

http://sqlfiddle.com/#!2/08a8b/1 (http://sqlfiddle.com/#%212/08a8b/1)



select pd.*,GROUP_CONCAT(pm.data SEPARATOR ', ') data
from product pd
inner join parameter pm on pd.id = pm.productid
where pm.data='corei3' OR pm.data='blue' GROUP BY pm.productid

http://sqlfiddle.com/#!2/08a8b/2

Weblove
جمعه 25 مهر 1393, 07:23 صبح
این مورد اخر خیلی خوب بود، اما زیاد کمکی نکرد
مجبور شدم از چند تا کوئری استفاده کنم و با رشته ها انقدر بازی کنم تا به نتیجه دلخواه برسم

از همگی کمال تشکر رو دارم که وقت گذاشتید

bagherok
جمعه 25 مهر 1393, 11:16 صبح
این مورد اخر خیلی خوب بود، اما زیاد کمکی نکرد
مجبور شدم از چند تا کوئری استفاده کنم و با رشته ها انقدر بازی کنم تا به نتیجه دلخواه برسم

از همگی کمال تشکر رو دارم که وقت گذاشتید





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

Weblove
جمعه 25 مهر 1393, 19:04 عصر
////////////// PARAMETERS
if(strlen(stristr($_SERVER['REQUEST_URI'],'pr-'))!=0)
{
$res_ch = mysql_query('select * from products_parameter where ct='.intval($_GET['id']).' and search=1 order by `sort` asc;');
$num_ch = mysql_num_rows($res_ch);
for($i=0;$i<$num_ch;$i++)
{
$ids .= ' select productid from products_parameter_data where data REGEXP \'';
$row_ch = mysql_fetch_array($res_ch);
$res_categories = mysql_query('select * from products_parameter_options where parameterid='.$row_ch['id'].' order by id desc;');
$num_categories = mysql_num_rows($res_categories);
for($ii=0;$ii<$num_categories;$ii++)
{
$row_categories = mysql_fetch_array($res_categories);
if(($_GET['parameter-'.$row_categories['parameterid'].'-'.$row_categories['id'].''])==$row_categories['title'])
{
$ids .= ''.$row_categories['title'].'|';
}
}
$ids .= '\';';
}

$ids = str_ireplace('|\'','\'',$ids);
$ids = str_ireplace('\'\'','\'ertyuioaisdfghop\'',$ids);

$res_ids = explode(';',$ids);
$num_ids = count($res_ids)-1;
for($i=0;$i<$num_ids;$i++)
{
$qq = $res_ids[$i].';';
$res_productids = mysql_query($qq);
$num_productids = mysql_num_rows($res_productids);
if($num_productids!=0)
{
for($ii=0;$ii<$num_productids;$ii++)
{
$row_productids = mysql_fetch_row($res_productids);
$pids .= $row_productids[0].'|';
}
$pids .= '^';
}
}

$res_pids = explode('^',$pids);
$num_pids = count($res_pids)-1;
for($i=0;$i<$num_pids;$i++)
{
$res_pids2 = explode('|',$res_pids[$i]);
$num_pids2 = count($res_pids2)-1;
for($ii=0;$ii<$num_pids2;$ii++)
{
if(substr_count($pids,$res_pids2[$ii].'|')==$num_pids)
{
if(strlen(stristr($new_pids,$res_pids2[$ii]))==0){$new_pids .= $res_pids2[$ii].',';}
}
}
}

if(strlen($new_pids)==0){$new_pids=0;}
$ifsearch .= '
AND id in (';
$ifsearch .= $new_pids;
$ifsearch .= ')';


$ifsearch = str_ireplace(',)',')',$ifsearch);
}
////////////// PARAMETERS

bagherok
جمعه 25 مهر 1393, 19:19 عصر
این همه کد چرا!
چیزی ازکدها دستگیرم نشد
یعنی این الان محصولاتی را که corei3 هستند و رنگ آبی دارند رو پیدا کنه
در صورت امکان خروجی نهایی رو هم قرار بدید و اینکه چه پارامترهایی سرچ شده

Weblove
جمعه 25 مهر 1393, 22:17 عصر
نکته کلیدی این کد اینجاست

if(($_GET['parameter-'.$row_categories['parameterid'].'-'.$row_categories['id'].''])==$row_categories['title']) { $ids .= ''.$row_categories['title'].'|'; }

Weblove
جمعه 25 مهر 1393, 22:19 عصر
این کد در واقع شناسه کلیه محصولاتی که شرایط خواسته شده رو دارند رو در یک متغیر یکجا می کنه و در کوئری نهایی فراخونی می کنه

مورد corei3 و blue رو فراموش کنید

برای مثال گفته بودم