ورود

View Full Version : مشکل در استفاده از DISTINCT



haniye70
دوشنبه 21 اسفند 1391, 18:20 عصر
با سلام خدمت تمامی اساتید محترم
من در یک کوری مشکل دارم من درتیبلم دوتا فیلد دار که کاربر کشور و شهر خودشو وارد میکنه
خود مشکلی ندارم تا اینجا ولی در جایی که می خوام از این اطلاعات استفاده کنم مشکل دارم
من می خوام دریک منوی ابشاری کشور و شهر کاربرا رو لیست کنم از اونجایی که ممکنه کشور و شهرا تکرار بشه من توی کوری که نوشتم
از تیبل کاربرا فقط می تونم فقط یک فیلد رو رو کنم توسط DISTINCT نمی تونم دوتا فیلد انخاب کنم تا جلوی تکرارشون رو بگیریم یعنی فقط یکیش میشه یا کشور یا شهر نمیشه دوتاش باشه






$result6t = $db->sql_query("SELECT DISTINCT country,city from ".$prefix."_user_item where subgroupt=4 ");
while ($row6 = $db->sql_fetchrow($result6t)) {
$row6['id'] = intval($row6['id']);
$country= $row6['country'];
$city= $row6['city'];

111qqq
دوشنبه 21 اسفند 1391, 18:39 عصر
خوب ببین ...
.... اگه فقط جواب سوالت رو بخوای نه نمیشه 2 بار از DISTINCT استفاده کرد.... میتونی توی حلقه ی while شهر ها رو بریزی توی یه آرایه و مدام چک کنی اگه شهر قبلا توی اون آرایه بود دیگه بهش اضافه نکنی..!!
.
.
ولی در واقع این کارت یه کم مورد داره .... میگی چرا؟؟ ...... مثلا اگه کشور ایران باشه توی اون جدولت کلی رکورد داری که مدام نوشه شده
ایران-تهران
ایران-خوزستان
ایران-کرج
و...
به تعداد استان ها یا شهر ها کلمه ایران استفاده شده ..... .
باید یک جدول درست کنی واسه ی کشور ها و بعد یه جدول واسه استان ها.... اونوقت جدول استان ها رو join(متصل) کنی به کشور ها... دیگه متصل کردن دو یا چند جدول رو هم که بلدی...!!!

haniye70
دوشنبه 21 اسفند 1391, 19:06 عصر
ببینید من الان کشورهارو نشون میدم خوب
ولی زیر شاخشون که همون شهرها هستن رو نمی تونم نشون بدم یه نگاه به کد کامل من بندازید




<li class='has-sub '><a href='#'><span>کشور</span></a>
<ul>
<?
$result6t = $db->sql_query("SELECT DISTINCT country from ".$prefix."_user_item where subgroupt=4 ");
while ($row6 = $db->sql_fetchrow($result6t)) {
$row6['id'] = intval($row6['id']);
$country= $row6['country'];
$city= $row6['city'];
$resultcountry = $db->sql_query("SELECT * from ".$prefix."_listbox WHERE id='$country'");
while ($rowu = $db->sql_fetchrow($resultcountry)) {
$ids= $rowu['id'];
$sname= $rowu['sname'];
echo" <li class=\"has-sub\"><a href=\"#\">$sname</a>";
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// $cityres= $db->sql_query("SELECT city from ".$prefix."_air_tour where subgroupt=4 ");
//while ($row7 = $db->sql_fetchrow($cityres)) {
//$row7['id'] = intval($row7['id']);
// $city= $row7['city'];

echo' <ul>';


$resultcountry = $db->sql_query("SELECT * from ".$prefix."_listbox_sub WHERE id='$city'");
while ($row66 = $db->sql_fetchrow($resultcountry)) {
$ids= $row66['id'];
$subname= $row66['subname'];
echo"
<li><a href=\"\">$subname</a></li>";
}
echo"</ul>";
}

//}
?>
</ul>



بخش اول که مقادیر قرارگرفته شده درون فیلد کشور و شهر یک عدد هستند عملیات مقایسه انجام میشه و اسم کشور رو بدون تکرار چاپ میکنم مشکلی هم ندارم حالا من نیاز به مقدار شهر در حلقه ای اول دارم که متاسفانه در عملیات DISTINCT نمی تونم اونو بگیرم فقط کشور رو میتونم اگر بتونم در حلقه ای اول شهر رو هم بگیرم در حلقه اخر میشه شهر های زیر مجموعه ای که کاربران وارد کردن رو نمایش بدم



:::: ببینید اطلاعات کشور ها و شهر ها همه درون دوتا تیبل جدا قرار دارند که بر اساس عملیات مقایسه بین یکی از فیلداشون من توی قسمت کاربری کاربرم دوتا لیست باکس ایجکس گذاشتم که کشور و شهرش رو انتخاب کنه من می خوام شهر ها و کشور های ذخیره شده در فیلد های کاربری رو نشون بدم نه زیر مجموعه کشور ها این موضوع رو من حل کردم من می خوام مثلا در ایران مثلا 40 شهر داریم حالا کاربرای من از 10 استان هستند می خوام همین 10 استان رو نشون بدم نه 40 استانی که زیر مجموعه کشور ایران هستند

linuxUser
دوشنبه 21 اسفند 1391, 23:25 عصر
می شه یه کم واضح تر توضیح بدید؟ من زیاد متوجه ساختار جداول و کاری که می خواید بکنید نشودم. به نظر من که کد پست دوم شما اشتباهه

$row6['id'] = intval($row6['id']);
اصلا توی کوری که نوشتید ستون id انتخاب نشده !!!؟؟!؟
در عین حال به نظرم تنها با استفاده از یک group by مشکل کوری اول شما حل می شه:
SELECT country,city from prefix_user_item where subgroupt=4 GROUP BY country,city
در عین حال با چیزای دست و پا شکسته ای که فهمیدم برای کد دوم هم اینو پیشنهاد می کنم:



$resultcountry = $db->sql_query("SELECT min(id), sname from ".$prefix."_listbox WHERE id='$country' group by sname");
while ($rowu = $db->sql_fetchrow($resultcountry)) {
$ids= $rowu['id'];
$sname= $rowu['sname'];




$resultcountry = $db->sql_query("SELECT min(id), subname from ".$prefix."_listbox_sub WHERE id='$city' group by subname");
while ($row66 = $db->sql_fetchrow($resultcountry)) {
$ids= $row66['id'];
$subname= $row66['subname'];


ببینید با این دو تا تغییر درست می شه؟

111qqq
سه شنبه 22 اسفند 1391, 00:25 صبح
خوب این روش linuxUser درسته ...
ولی واسه ی اینکه کار کد شما راه بایفته .....
الان مشکلت توی این تیکه کده


echo' <ul>';


$resultcountry = $db->sql_query("SELECT * from ".$prefix."_listbox_sub WHERE id='$city'");
while ($row66 = $db->sql_fetchrow($resultcountry)) {
$ids= $row66['id'];
$subname= $row66['subname'];
echo"
<li><a href=\"\">$subname</a></li>";
}
echo"</ul>";
}


خوب .. حالا مشکلت چیه ...... شهر ها رو تکراری واست چاپ میکنه ؟؟؟؟؟؟ ..... یا اینکه مثلا همه ی شهر ها رو که id='$city' رو نمیاره ؟؟؟؟

اگه تکراری واست چاپ میکنه که الان دیگه می تونی از DISTINCT استفاده کنی

اما الان مشکلت اینه که شهر های مربوط به اون کشور رو نمی تونی انتخاب کنی ؟؟؟
باید یه ستون به جدول شهرت اضافه کنی به اسم id_table_country ..... که مثلا توی جدول کشور id ایران برابر 33 هست .. حالا توی جدول شهر باید هر شهری که به ایران تعلق داره id_table_country مقدارش رو برابر 33 قرار بدی .... اونوقت توی کوئریت مینویسی که تمام سطر هایی که id_table_country=33 هست رو بیار ... اگر اسم شهر رو تکراری داشتی از همون DISTINCT استفاده میکنی ...

haniye70
سه شنبه 22 اسفند 1391, 00:58 صبح
:لبخند: باور میکنید خودم هم گیج یزنم کدها رو یبین بزارید کامل موضوع رو بازترش کنیم خوب........

اول من دوتا تیبل دارم به این صورت اولی کشورها به صورت فارسی شده درونش هستند + ای دیهاشون
دومی شهرکه ای دی کشورهای مربوطه درونش قرار دارند
اینجارو ببینید ابتدا ساختار تیبل listbx که همون کشورها درونش قرار داره


id sname simage stext counter

sname اسامی کشورها رو من از طریق ادمین دستی میتونم کمو زیاد کنم حرفی نیست

ساختار listbox_sub که اسامی شهر ها رو من از طریق ادمین کمو زیاد میتونم بکنم

id subname subimage subtext sub_counter sub_get_id

sub_get_id ای دی کشوردرونش قرار یگیره مثلا ایران رو داریم چندین شهر هم هستن خوب باید یه کلید برای شناسایی شهرها در نظر بگیرم خوب که منsub_get_id رو در نظر گرفتم که توی ادمین من بهش میگم این شهر مال کدو کشور هست کشور هم ای دیش معلومه

تا اینجارو در نظر بگیرید


*************************
در پنل کاربری کاربران من اومدم همین دوتا تیبل رو ایجکسش کردم به خوبی هم کار میکنه مقادیر کشور که همون ایدیشه و مقادیر شهر هم که اونم همون ایدیشه رو میریزم توی تیبل مخصوص کاربرانن

*************************

خوب حالا من یه منوی ابشاری که هر بخشش خودش دوباره زیر مجموعه داره همون چیلد ها:لبخند: <li> <li/> تودر تو بالای سایتم دارم

برای چیه؟ سایت فیسنما رو دیدین حتما که یه سرچ داره بر اساس کشور و شهر کاربرا است
من سرچ ندارم من میخوام کشور و شهر کاربرانم رو نمایش بدم که مثلا بر روی ایران زیرمجموعه> تهران کلیک کردن کاربران تهرانی رو نشون بدم برای این می خوام:لبخند:
**************************

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




$result6t = $db->sql_query("SELECT * country,city from ".$prefix."_user_item where subgroupt=4 ");


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

*******************
خوب من فرض میگیرم که کوری من درسته اگه DISTINCT country که الان درستم هست مشکلی نداره....!
ای دی کشور ها رو از فیلد country کاربران بیرون کشیدم بدون تکرار
**********************
در کوری دوم که فکر کنم کاملا مشخصه



$resultcountry = $db->sql_query("SELECT * from ".$prefix."_listbox WHERE id='$country'");
while ($rowu = $db->sql_fetchrow($resultcountry)) {
$ids= $rowu['id'];
$sname= $rowu['sname'];
echo" <li class=\"has-sub\"><a href=\"#\">$sname</a>";
}



مقداری که گرفته شده و در country کاربر بیرون کشیده شده رو به کوری دوم میدیم که مقایسه میکنه میبینه اسمش چیه مقایسه هم بر اساس id ها هست تا اینجا با موفقیت ما کشور ها رو نمایش می دیم

*****************
مرحله بعد که ما هنوز در کوری و حلقه ای اولیه گیر هستیم برای تکرار اینجاست که مشکل شروع میشه...!
چرا زیرا مقدار city رو نتونستیم توی حلقه بندازیم تا به این کوری برسونیم و رو کنیم




$resultcity = $db->sql_query("SELECT * from ".$prefix."_listbox_sub WHERE id=$city");

while ($row66 = $db->sql_fetchrow($resultcity)) {
$ids= $row66['id'];
$subname= $row66['subname'];
echo"
<li><a href=\"\">$subname</a></li>";
}
echo"</ul>";






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


$resultcity = $db->sql_query("SELECT * from ".$prefix."_listbox_sub WHERE sub_get_id =$country");


اونم اینه که تمامی شهر های زیر مجموعه کشور ها رو نشون میده بدونی که اصلا کاربرا اونو ذخیره کرده باشند درون تنظیماتشون



**************
حالا من می خوام قسمت اخر حل بشه یعنی بشه که کشور که نمایش داده شد شهر های هم که کاربرا ذخیره کردن و مربروط به همون کشور هستن رو نشون بده بدون تکرار


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

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

$resultcity = $db->sql_query("SELECT * from ".$prefix."_listbox_sub WHERE sub_get_id =$country");

یک شرط بزاریم که شهر ها بر اساس اونایی باشند که با city کاربر برابراند تمومه فکر کنم

از بس تست کردم گیج میزنم دیگه

111qqq
سه شنبه 22 اسفند 1391, 18:45 عصر
خوب توی جدول کاربرها یه ستون داری مثلا به اسم id_city که یه عدده و اشاره داره به یه رکورد توی جدول شهر که اسم یه شهر مثلا رکود "تهران" ....
حالا جدول کاربرا رو به جدول شهر متصل میکنی و مینویسی


"SELECT DISTINCT city.name FROM city JOIN user ON user.id_city=city.id"

الان دیگه فقط اون رکورد هایی سلکت میشه که توی جدول کاربرها در ستون id_city موجوده .... تکرار هم نمیشن.

حل شد ؟؟؟؟؟؟؟ ..... یه کم بیشتر مطالعه کن ...

haniye70
سه شنبه 22 اسفند 1391, 20:11 عصر
:لبخند: سلام خوب چرا میزنی من join کردن و بلد نیستم چیکار باید کنم

اگر امکان داره یه خورده ریزتر توضیح دهید من کوری رو اینجوری در اوردم ولی نتیجه ای نگرفتم
البته توی این سایت یه چیزای خوندم سردرد گرفتم
http://www.sitepoint.com/understanding-sql-joins-mysql-database/






$resultcity = $db->sql_query("SELECT ".$prefix."_user_item.city
from ".$prefix."_user_item INNER JOIN ".$prefix."_listbox_sub on ".$prefix."_user_item.city=id");

111qqq
سه شنبه 22 اسفند 1391, 21:12 عصر
خوب ... بهتره اول استراحت کنی :قهقهه:.... بعد بری بیشتر راجع به sql مطالعه کنی ... بعد برگردی سراغ پروژت
راجع به بلد نبودن join کمکی از دستم بر نمیاد :بامزه: ..... مطلب زیاده
ولی ...
بعد از on رو درست بنویس ... id از کدوم جدول...!!




$resultcity = $db->sql_query("SELECT ".$prefix."_user_item.city from ".$prefix."_user_item INNER JOIN ".$prefix."_listbox_sub on ".$prefix."_user_item.city=".$prefix."_listbox_sub.id");

haniye70
سه شنبه 22 اسفند 1391, 21:44 عصر
:بامزه:

خوب id مربوط به شهرها میشه که باید با مقداری که همون ای دی شهر ها هست درون city کاربر قرار داره مقایسه بشه
یعنی باید یه جوری join بشه که
هم مقدار داخل city کاربر در تیبل user_item

با مقدار برابر با id شهر ها درون تیبل _listbox_sub
برابر بشه

تا مقایسه صورت بگیره و اونا رو نشون بده همه

111qqq
سه شنبه 22 اسفند 1391, 21:59 عصر
خوب گفتم درستش کن که جواب بگیری .... اگه ارور داری ارورت هم بگو



on ".$prefix."_user_item.city=".$prefix."_listbox_sub.id"