PDA

View Full Version : سوال: کمک برای استفاده از inner join



mamali-mohammad
شنبه 14 دی 1392, 16:02 عصر
با سلام
این کد رو ببینید :

$sql1 = mysql_query("SELECT * FROM `table` WHERE `active`='1' GROUP BY `title` ORDER BY `id` ASC");
while ($row = mysql_fetch_array($sql1)){

$title = $row["title"];

$sql2 = mysql_query("SELECT * FROM `table` WHERE `active`='1' AND `title`='$title' GROUP BY `title` ORDER BY `id` DESC");
while ($row2 = mysql_fetch_array($sql2)){

$sql3 = mysql_query("SELECT * FROM `table` WHERE `active`='1' AND `title`='$title' GROUP BY `name` ORDER BY `id` DESC");
while ($row3 = mysql_fetch_array($sql3)){
echo $row3["name"];
}
}
}

این کد کاملا واقعی هست
چطوری میتونم از inner join استفاده کنم که اینقدر query بی خود نگیره ؟
ممنون

marys_farahani
شنبه 14 دی 1392, 16:54 عصر
من میخواستم کمکتون کنم اما منطق نوشتن این کدها رو درک نکردم

engmmrj
شنبه 14 دی 1392, 17:07 عصر
الکی که بین Table ها Join نمی کنن باید ارتباطی با هم داشته باشن !

mamali-mohammad
شنبه 14 دی 1392, 17:18 عصر
ممنون
خب توضیح میدم
SQL1 میاد اطلاعات رو که فعال هستن با title گروه بندی میکنه و بعدش title$ رو از دیتابیس در میاریم
SQL2 میاد اطلاعات رو که فعال هستن و عنوانشون با title$ برابری میکنه و با title گروه بندی می کنه و میکشه بیرون
SQL3 میاد اطلاعات رو که فعال هستن و عنوانشون با title$ برابری میکنه و با name گروه بندی میکنه و میکشه بیرون
در نهایت name$ چاپ میشه
همه این اطلاعات از table کشیده میشه بیرون

javadt
شنبه 14 دی 1392, 17:54 عصر
دوست عزیز فکر نمی کنم از روش نرمالی برای بانک و کد نویسی استفاده کرده باشید

mamali-mohammad
شنبه 14 دی 1392, 18:16 عصر
خب منم میخوام کمکم کنید که به حالت نرمال تبدیل بشه !

id1385
شنبه 14 دی 1392, 18:49 عصر
سلام
نتیجه ای که الان می گیری را با یک عکس یا sql از تیبلت بذار، حل میشه :چشمک:

mamali-mohammad
شنبه 14 دی 1392, 20:18 عصر
خروجی صحیح هست
اما کد استاندارد نیست
میخوام بهینه ترین شکل ممکن رو داشته باشم
کد کاملا مشخصه و منم کاملا توضیح دادم
واقعا چیز گنگی در کد نیست دوستان

javadt
شنبه 14 دی 1392, 22:52 عصر
شما فایل sql جداولت رو بزار تا بشه بررسی کرد

Veteran
شنبه 14 دی 1392, 23:20 عصر
من قبلا عرض کردم، اگر جدول رو بزارید، بهتر میشه کمک کرد

mamali-mohammad
یک شنبه 15 دی 1392, 00:03 صبح
اقا اصلا کد هارو بیخیال شیم
چطوری می تونم برای یه تیبل innerjoin بزنم ؟
به این روش :
فقط مواردی رو نشون بده که برابر با مقدار title از همون جدول باشه

$sql = mysql_query("SELECT * FROM `all` WHERE `category`='car' GROUP BY `title`");
while ($row = mysql_fetch_array($sql)){
$title = $row["title"];
$sql1 = mysql_query("SELECT * FROM `all` WHERE `title`='$title'");
while ($row1 = mysql_fetch_array($sql1)){
echo $row1["name"];
}
}

javadt
یک شنبه 15 دی 1392, 00:30 صبح
دوست عزیز برای این گفتم فایل رو بزار که اطلاعاتت حقیق باشه و بشه درست راهنماییت کرد
الان با کد بالای شما نیازی به inner join نیست شما کافی شرط WHERE `title`='$title' از کوئری دوم رو به کوئری اول اضافه کنی

marys_farahani
یک شنبه 15 دی 1392, 09:31 صبح
دوست عزیز میدونید چرا سایر دوستان اصرار دارن شما ساختار جدولتون بزارید به خاطر انیکه احتمالا ساختارتون مشکل داشته باشه اول باید اون اصلاح بشه :لبخندساده:

http://up.p30parsi.com/out.php/i190413_1.jpg (http://up.p30parsi.com)


ببنید منظورتون اینکه شما یه سری رکورد دارید که سر دسته هستن و یک سری دیگه زیر مجموعه اونها اگه منظورتون این باشه ساختارتون مشکل داره و به نinner join نیازی نیست

زمانیinner join میزنن که بخوان بین دو جدول ارتباط ایجاد کنن .

nemo php
یک شنبه 15 دی 1392, 11:50 صبح
http://w3schools.com/sql/sql_join_inner.asp

مثال خوبی هستش.

شما ابتدا باید توی بانک اطلاعاتیتون دو جدول رو با یک idبه هم ارتباط بدید.

marys_farahani
یک شنبه 15 دی 1392, 12:41 عصر
اگه منظورتون همون باشه که من برداشت کردم این روش بهتون پیشنهاد میدم.



SELECT
`a`.`id`,
`a`.`title`,
`a`.`name`,
GROUP_CONCAT(`b`.`id`) as `id_parent`,
GROUP_CONCAT(`b`.`name`) as `name_parent`
FROM `table` AS a
INNER JOIN `table` as `b` ON `a`.`id` = `b`.`parent_id`
WHERE `a`.`active`='1' AND `a`.`parent_id` = '0'
GROUP BY `a`.`id`
ORDER BY `a`.`id` ASC;




این جدول



CREATE TABLE IF NOT EXISTS `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) NOT NULL DEFAULT '0',
`title` varchar(200) NOT NULL,
`name` varchar(200) NOT NULL,
`active` tinyint(4) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;


که یک فیلد بهش اضافه کردم.

اینم خروجی کار

http://up.p30parsi.com/out.php/i190420_untitled-1.jpg (http://up.p30parsi.com)