استفاده از JOIN و ساخت پرس و جوی ترکیبی در MySQL

مطالبی که تا این لحظه از بخش آموزش مقدماتی MySQL فرا گرفته ایم معمولا برای حالت های متداول و کار با جداول به صورت مجزا کافی خواهند بود، اما در برنامه نویسی های پیشرفته تر و در طراحی ساختار برنامه های پیچیده نیاز به نوشتن پرس و جوهای ترکیبی و برقراری تعامل بیشتر بین جداول موجود در دیتابیس است، این نیاز سبب شده که قابلیت دیگری تحت عنوان JOIN (و مشتقات آن) به دستورات MySQL اضافه شود که به کمک آن می توان پرس و جوهای ترکیبی نوشت و بین جداول مختلف ارتباط برقرار کرد، در ادامه در مورد آن بیشتر خواهیم گفت.
ساخت جداول فرضی با دستور CREATE
برای درک بهتر نحوه عملکرد دستور JOIN پیش از هر چیز لازم است که چند جدول و ستون فرضی با مقادیری از پیش تعریف شده بسازیم که در زیر پرس و جوی آن را ملاحظه می کنید.
نکته: پیش از اجرای کدهای زیر باید از طریق برنامه phpMyAdmin دیتابیسی با نام فرضی test بسازید، دقت کنید که Collation دیتابیس بر روی utf8_persian_ci تنظیم شده باشد.
<?php
$con = mysql_connect("localhost","root","");
if (!$con){
die('اتصال برقرار نشد: ' . mysql_error());
}
mysql_select_db("test", $con);
mysql_query("SET NAMES 'utf8'");
mysql_query("CREATE TABLE tbl_1(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(255),
skill VARCHAR(255)) ENGINE=MyISAM ")
or die(mysql_error());
mysql_query("ALTER TABLE tbl_1
DEFAULT CHARACTER SET utf8
COLLATE utf8_persian_ci;")
or die(mysql_error());
mysql_query("CREATE TABLE tbl_2(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
language VARCHAR(255),
count VARCHAR(255)) ENGINE=MyISAM ")
or die(mysql_error());
mysql_query("ALTER TABLE tbl_2
DEFAULT CHARACTER SET utf8
COLLATE utf8_persian_ci;")
or die(mysql_error());
echo "جدول با موفقیت ساخته شد!<br>";
//اطلاعات اولیه به صورت آرایه
$name_skill = array('علی' => 'HTML', 'ساسان' => 'PHP', 'پدرام' => 'Ajax');
$language_count = array('HTML' => 9, 'PHP' => 3, 'Ajax' => 6);
//ذخیره در دیتابیس
foreach($name_skill as $key => $value){
mysql_query("INSERT INTO tbl_1 (name, skill) VALUES('$key', '$value')")
or die(mysql_error());
}
foreach($language_count as $key => $value){
mysql_query("INSERT INTO tbl_2 (language, count) VALUES('$key', '$value')")
or die(mysql_error());
}
echo "اطلاعات با موفقیت افزوده شد!<br>";
mysql_close($con);
?>
پرس و جوی بالا دو جدول با مقادیری از پیش تعریف شده ایجاد می کند، در جدول نخست لیست کاربران به همراه مهارت برنامه نویسی آنها به صورت زیر قرار دارد.id name skill
1 علی HTML
2 ساسان PHP
3 پدرام Ajax
در جدول دوم عنوان هر زبان برنامه نویسی و به فرض تعداد برنامه نویس موجود و مسلط به آن زبان درج شده.id language count
1 HTML 9
2 PHP 3
3 Ajax 6
همان طور که ملاحظه می کنید بین دو جدول در ستون های skill و language ارتباطی متقابل وجود دارد (هر دو ستون عناوین مربوط به زبان های برنامه نویسی را در خود دارند)، بنابراین به فرض اگر بخواهیم مسابقه ای بین افراد هم مهارت برگزار کنیم و نیاز به محاسبه تعداد رقبای اسامی موجود در جدول اول باشد، به ناچار باید در پرس و جوی خود هم از اصلاعات جدول اول (اسامی و مهارت آنها) و هم از اطلاعات جدول دوم (مهارت و تعداد شرکت کننده) استفاده کنیم، هرچند این کار با نوشتن دو پرس و جو نیز امکانپذیر است، اما حرفه ای تر آن است که به کمک JOIN و مشتقات آن (INNER JOIN، LEFT JOIN، RIGHT JOIN، OUTER JOIN) یک پرس و جوی ترکیبی نوشته و به هدف خود برسیم، بدین ترتیب می توان نوشت:$resutl = mysql_query("SELECT tbl_1.name, tbl_2.count FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.skill = tbl_2.language")
or die(mysql_error());
while($row = mysql_fetch_array($resutl)){
echo $row['name']. ' : ' .$row['count']. '<br>';
}
که خروجی دستور بالا به صورت نمونه زیر خواهد بود.علی : 9
ساسان : 3
پدرام : 6
نکته: برای تعریف شرط در هنگام استفاده از دستور JOIN (و مشتقات آن)، از عبارت ON استفاده می شود.برای آشنایی بیشتر با JOIN و مشتقات آن، در ادامه به صورت موردی این دستور را بررسی می کنیم.
حالت INNER JOIN
حالت اول از مشتقات دستور JOIN به صورت INNER JOIN می باشد، در این حالت می توان به مواردی مشترک از هر دو جدول دسترسی داشت، نتیجه پرس و جو شامل برخی موارد از جدول اول به همراه برخی موارد دیگر از جدول دوم (بر اساس شرط تعیین شده) خواهد بود، مثال:
SELECT tbl_1.skill, tbl_2.count FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.skill = tbl_2.language
خروجی این حالت به صورت زیر خواهد بود.skill count
HTML 9
PHP 3
Ajax 6
ملاحظه می کنید که با اجرای پرس و جوی بالا ردیف های زیر از جدول اول:HTML
PHP
Ajax
و ردیف های زیر از جدول دوم به عنوان خروجی برگردانده می شوند:9
3
6
حالت LEFT JOIN
نوع دیگر از مشتقات دستور JOIN به صورت LEFT JOIN است که در این حالت تمام ردیف های جدول اول صرف نظر از شرط تعیین شده به همراه ردیف های جدول دوم (بر اساس شرط تعیین شده) به عنوان خروجی برگردانده می شوند، مثال:
SELECT tbl_1.skill, tbl_2.count FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.id = tbl_2.count
خروجی پرس و جوی بالا به صورت زیر خواهد بود.skill count
HTML NULL
PHP NULL
Ajax 3
نکته: ردیف هایی که در جدول دوم بر اساس شرط تعریف شده انتخاب نشوند، با مقدار NULL برگردانده می شوند.حالت RIGHT JOIN
مشابه حالت LEFT JOIN، حالت RIGHT JOIN است که در این صورت ردیف ها از جدول دوم صرف نظر از شرط تعیین شده انتخاب و ردیف های جدول اول بر اساس شرط انتخاب می شوند، مثال:
SELECT tbl_1.skill, tbl_2.count FROM tbl_1 RIGHT JOIN tbl_2 ON tbl_1.id = tbl_2.count
خروجی پرس و جوی بالا به صورت زیر خواهد بود.skill count
NULL 9
Ajax 3
NULL 6
حالت OUTER JOIN
حالت آخر از مشتقات JOIN به صورت OUTER JOIN یا FULL JOIN است که در این صورت می توان دو پرس و جوی مبتنی بر JOIN را با عبارت کلیدی UNION (اجتماع) به هم مرتبط نمود، مثال:
SELECT tbl_1.skill, tbl_2.count FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.id = tbl_2.count UNION SELECT tbl_1.skill, tbl_2.count FROM tbl_1 RIGHT JOIN tbl_2 ON tbl_1.id = tbl_2.count
نتیجه پرس و جوی بالا به صورت زیر خواهد بود.skill count
HTML NULL
PHP NULL
Ajax 3
NULL 9
NULL 6
دسته بندی: آموزش مقدماتی » MySQL
برچسب ها: MySQL
« بعدی

اتصال PHP به MySQL با اکستنشن MySQLi
ساخت دیتابیس، جدول و ستون با دستور CREATE در MySQL
آموزش MySQL، سیستم مدیریت پایگاه داده
حذف مقادیر از MySQL با دستور DELETE
نحوه ذخیره کردن اطلاعات با دستور INSERT در MySQL
دیدگاه


mohsen
۱۲:۴۲ ۱۴۰۱/۰۱/۰۲
ممنونم. اگه یه آموزش در مورد index گذاری درست در SQL بزارین خیلی خوب میشه. چون فکر می کنم که سوال خیلی ها باشه.
در کوتاه مدت متاسفانه میسر نیست، انشاا.. در آینده مطلبی در این خصوص منتشر خواهد شد.
mohsen
۱۰:۲۲ ۱۴۰۱/۰۱/۰۲
سلام. من یه سوال داشتم. برای نوشتن یک لوپ و نمایش دادن اطلاعات ، مجبور شدم اکثر جداول SQL رو درگیر کنم (حدود 10 جدول) برای نوشتن کدها دو تا راه وجود داره یکی به صورت :
تعداد جدول های درگیر حدود 10 جدول و هر جدول حدود 20 ستون و 100.000 رکورد داره.
$res = mysqli_query($SQLconnect,"Select * From `TB1` Where `xxx` = '1' Order By `id` DESC Limit 500");
while(@$row = mysqli_fetch_array($res)){
...
$yyy = mysqli_num_rows(mysqli_query($SQLconnect,"Select `id` From `tb2` Where `ccc` = '$row[id]' and `zzz` = '0'"));
...
$zzz = mysqli_fetch_array(mysqli_query($SQLconnect,"Select * From `tb3` Where `id` = '$row[xid]'"));
...
$sss = mysqli_fetch_array(mysqli_query($SQLconnect,"Select * From `tb4` Where `id` = '$row[yid]'"));
...
};
و راه دوم اینه که اول جدول ها رو به هم Join کنیم و بعد دستور while رو اجرا کنیم. خواستم ببینم کدام دستور بهتره و سریعتر اجرا میشه و فشار کمتری به سرور میاد.تعداد جدول های درگیر حدود 10 جدول و هر جدول حدود 20 ستون و 100.000 رکورد داره.
برای مقایسه دو نوع پرس و جو باید دقیقا فرایندی که از ابتدای اجرای کدها شروع و به انتها ختم می شود قابل تست و بررسی باشد تا بشود نتیجه دقیق گرفت اما در مجموع راه حل ها و قواعد کلی برای داشتن پرس و جوی بهینه وجود دارد از جمله اینکه:
1- در درجه اول ساختار جداول دیتابیس و مخصوصا استفاده از ایندکس گذاری (Index) جهت افزایش سرعت به شدت مهم است، در صورتی که برای ستون های درگیر در قسمت WHERE به درستی Index تعریف کنید فشار مضاعفی را از دوش سیستم برمی دارید.
2- استفاده از ستون های مورد نیاز در قسمت SELECT به جای کاراکتر * که تمام ستون ها را انتخاب می کند.
3- درگیر بودن جدول و ستون صرفا در زمانی که واقعا به آن نیاز است و جلوگیری از فراخوانی بی مورد آنها به خصوص در حلقه ها.
4- در نظر گرفتن LIMIT برای مواردی که به تعداد محدودی ردیف احتیاج است.
با این توضیحات اگر اجرای دستور JOIN کمکی به موارد بالا می کند شاید در افزایش راندمان کار نقش مثبت داشته باشد در غیر اینصورت تفاوت محسوسی نمی کند و صرفا خوانش و درک کدها را پیچیده خواهد کرد.
1- در درجه اول ساختار جداول دیتابیس و مخصوصا استفاده از ایندکس گذاری (Index) جهت افزایش سرعت به شدت مهم است، در صورتی که برای ستون های درگیر در قسمت WHERE به درستی Index تعریف کنید فشار مضاعفی را از دوش سیستم برمی دارید.
2- استفاده از ستون های مورد نیاز در قسمت SELECT به جای کاراکتر * که تمام ستون ها را انتخاب می کند.
3- درگیر بودن جدول و ستون صرفا در زمانی که واقعا به آن نیاز است و جلوگیری از فراخوانی بی مورد آنها به خصوص در حلقه ها.
4- در نظر گرفتن LIMIT برای مواردی که به تعداد محدودی ردیف احتیاج است.
با این توضیحات اگر اجرای دستور JOIN کمکی به موارد بالا می کند شاید در افزایش راندمان کار نقش مثبت داشته باشد در غیر اینصورت تفاوت محسوسی نمی کند و صرفا خوانش و درک کدها را پیچیده خواهد کرد.
سجاد
۱۷:۲۲ ۱۳۹۹/۱۱/۱۶
سلام میشه از دوتا دیتابیس با یک کوئری سلکت بگیریم
بله با UNION این کار شدنی است، مثال:
SELECT `col_name` FROM `db_1`.`tbl_name` WHERE `col_id` = 1
UNION
SELECT `col_name` FROM `db_2`.`tbl_name` WHERE `col_id` = 1
دقت کنید نام کاربری استفاده شده در هنگام برقراری اتصال باید به هر دو دیتابیس دسترسی داشته باشد.۰۲:۱۰ ۱۳۹۹/۰۶/۱۳
سلام
ابتدائا از سایت مفیدتون تشکر می کنم. من خیلی از آموزه هام رو از سایت شما یاد گرفتم.
یه سوال دارم
من دو تا جدول دارم. تو جدول درخواست ها، درخواست هایی ثبت می شن که یه متن درخواست داره. یه گروه درخواست (مثلا پشتیبانی) و یه دونه هم زیرگروه درخواست (مثلا مالی)
ولی برای راحتی کار این درخواست ها رو بجای نام دادن کد عددی دادم. مثلا درخواست پشتیبانی کد 1 داره. درخواست فنی تو زیر گروه پشتیبانی کد 20 داره. حالا یه جدول هم واسه اسامی اینها دارم. مثلا اسم درخواست شماره 1 هست پشتیبانی. اسم درخواست 2 هست خرید و ... . لازم به ذکره که تو جدول دوم هر درخواست یه دونه آیدی والد داره که بتونم یه لول زیرمجموعه بزارم. یعنی مثلا درخواست شماره 20 دارای آیدی والد 1 هست. یعنی زیر مجموعه کد 1 (پشتیبانی) است.
حالا می خوام یه کوئری بگیرم که توش متن درخواست از جدول یک گرفته بشه و نام گروه اصلی و نام زیر گروه از جدول دوم.
چطوری می تونم این کار رو انجام بدم.
به راحتی می تونم با join inner متن درخواست و نام زیرگروه رو بگیرم. اما نتونستم نام گروه اصلی رو هم بگیرم.
با کوئری زیر متن و زیر گروه رو به راحتی می گیرم:
ابتدائا از سایت مفیدتون تشکر می کنم. من خیلی از آموزه هام رو از سایت شما یاد گرفتم.
یه سوال دارم
من دو تا جدول دارم. تو جدول درخواست ها، درخواست هایی ثبت می شن که یه متن درخواست داره. یه گروه درخواست (مثلا پشتیبانی) و یه دونه هم زیرگروه درخواست (مثلا مالی)
ولی برای راحتی کار این درخواست ها رو بجای نام دادن کد عددی دادم. مثلا درخواست پشتیبانی کد 1 داره. درخواست فنی تو زیر گروه پشتیبانی کد 20 داره. حالا یه جدول هم واسه اسامی اینها دارم. مثلا اسم درخواست شماره 1 هست پشتیبانی. اسم درخواست 2 هست خرید و ... . لازم به ذکره که تو جدول دوم هر درخواست یه دونه آیدی والد داره که بتونم یه لول زیرمجموعه بزارم. یعنی مثلا درخواست شماره 20 دارای آیدی والد 1 هست. یعنی زیر مجموعه کد 1 (پشتیبانی) است.
حالا می خوام یه کوئری بگیرم که توش متن درخواست از جدول یک گرفته بشه و نام گروه اصلی و نام زیر گروه از جدول دوم.
چطوری می تونم این کار رو انجام بدم.
به راحتی می تونم با join inner متن درخواست و نام زیرگروه رو بگیرم. اما نتونستم نام گروه اصلی رو هم بگیرم.
با کوئری زیر متن و زیر گروه رو به راحتی می گیرم:
SELECT req.text, category.name FROM req INNER JOIN category ON req.request_kind = category.parent_id AND req.request_sub_kind = category.id
ممنون می شم راهنماییم کنیدطبق توضیحات و برداشتی که از ساختار دیتابیس می توان داشت با نمونه پرس و جوی ترکیبی زیر می توانید متن، نام اصلی و زیرمجموعه را داشته باشید:
SELECT r1.text, c1.name AS kind, c2.name AS sub_kind FROM req r1 INNER JOIN category c1 ON r1.request_kind = c1.id INNER JOIN category c2 ON r1.request_sub_kind = c2.id LIMIT 0 , 30
منتها به نظر ساختار جداول و ارتباط آنها دارای اشکال است و می توان با افزودن چند ستون ارتباط منطقی تری بین دو جدول ایجاد و از سردرگمی جلوگیری کرد، در نمونه پرس و جویی هم که درج کرده اید در قسمت آخر به category.id اشاره دارد که ظاهرا باید ستونی از نوع افزایش خودکار باشد؟ در صورت تمایل می توانید نمونه ساختار قابل تست جداول را به صورت فایل SQL به ایمیل ما (موجود در بخش تماس) ارسال کنید تا بیشتر بررسی کنیم.میثم
۲۳:۵۸ ۱۳۹۹/۰۵/۰۱
سلام
من برای دریافت چند تا اطلاعات از جداول سایتم مجبور شدم دستور زیر رو اجرا کنم.
هر کدام از جداول حدود ۱.۰۰۰.۰۰۰ رکورد دارن.
راستی من به تمام ستون های هر دو تا جدول برای نمایش اطلاعات نیاز دارم.
من برای دریافت چند تا اطلاعات از جداول سایتم مجبور شدم دستور زیر رو اجرا کنم.
هر کدام از جداول حدود ۱.۰۰۰.۰۰۰ رکورد دارن.
$res=mysql_query("Select * From tba INNER JOIN tbb ON tba.xxx = tbb.yy Where tba.zzz = '2' and find_in_set(3,vvv) Order By tba.time DESC Limit 50");
به نظرتون دستور بالا بهینه هست و آیا راهی هست که بشه سرعت اجرای دستور رو بالاتر برد؟راستی من به تمام ستون های هر دو تا جدول برای نمایش اطلاعات نیاز دارم.
در صورتی که از ایندکس گذاری (Indexing) بر روی ستون های درگیر در تصمیم گیری MySQL در انتخاب نتایج (به فرض ستون های tba.xxx، tbb.yy، tba.zzz، tba.time) استفاده کرده باشید پرس و جو بهینه است، نکته دوم اینکه برای کدهای جدید از اکستنشن MySQLi استفاده کنید (آموزش فعلی قدیمی است و به زودی ویرایش می شود).
امیر
۰۵:۲۹ ۱۳۹۹/۰۲/۱۹
با سلام، خدمت دوستان عزیز دو جدول به نامهای Messages و Comments موجود هستند.
در جدول Comments فیلدی به نام IDElement وجود دارد که ID پیامی که کامنت برای آن ثبت شده ذخیره میشود (مشخص میکند کامنت جاری مربوط به کدام رکورد از جدول Message است). همچنین در هر دو جدول فیلدهایی با نام IsShow وجود دارند که بیانگر نمایش و عدم نمایش هستند با مقدار True و False جدول Comments یک فیلد Action هم دارد که مشخص میکند این کامنت مربوط به پیامها هستند (Messages) یا خبرها (News) که در آن یک رشته ثابت "Post" یا "News" ذخیره میشود.
حال میخواهم کوئری SQL بنویسم که در یک جدول تمام IDMessage ها و تعداد کامنتهای مربوط به آنها را برگرداند. (اگر پیامی کامنت نداشت باید مقدار فیلد تعداد کامنت صفر درنظر گرفته شود و اینکه کامنت هایی که IsShow آنها False هستند درنظر گرفته نشوند..)
با تشکر
در جدول Comments فیلدی به نام IDElement وجود دارد که ID پیامی که کامنت برای آن ثبت شده ذخیره میشود (مشخص میکند کامنت جاری مربوط به کدام رکورد از جدول Message است). همچنین در هر دو جدول فیلدهایی با نام IsShow وجود دارند که بیانگر نمایش و عدم نمایش هستند با مقدار True و False جدول Comments یک فیلد Action هم دارد که مشخص میکند این کامنت مربوط به پیامها هستند (Messages) یا خبرها (News) که در آن یک رشته ثابت "Post" یا "News" ذخیره میشود.
حال میخواهم کوئری SQL بنویسم که در یک جدول تمام IDMessage ها و تعداد کامنتهای مربوط به آنها را برگرداند. (اگر پیامی کامنت نداشت باید مقدار فیلد تعداد کامنت صفر درنظر گرفته شود و اینکه کامنت هایی که IsShow آنها False هستند درنظر گرفته نشوند..)
با تشکر
برای انتخاب از جدول اول در حالت اشتراک و عدم اشتراک ستون ها باید پرس و جوی ترکیبی بنویسیم، می توانید از نمونه پرس و جوی زیر الگوبرداری کنید:
(SELECT a.id AS 'message_id', COUNT(b.IdElement) AS 'comment_count' FROM messages a LEFT JOIN comments b ON a.id = b.IdElement WHERE b.IsShow = 'True' GROUP BY a.id)
UNION
(SELECT id AS 'message_id', 0 AS 'comment_count' FROM messages WHERE id NOT IN (SELECT IdElement FROM comments))
hasti
۲۰:۰۵ ۱۳۹۹/۰۲/۱۶
سلام . وقت بخیر . میشه مثالی بزنید که right over join برابر با inner join (داخلی) بشه . /با order و customer/
و یدونم left over join برابر با inner join (داخلی) بشه
خیییلی ممنون .
و یدونم left over join برابر با inner join (داخلی) بشه
خیییلی ممنون .
برابر شدن نتیجه پرس و جوها در حالت JOIN به ساختار دیتابیس و مقادیر ردیف ها بستگی دارد، همچنین معمولا این در شرایطی است که پارامتر WHERE در پرس و جو در نظر گرفته شود، به فرض:
SELECT tbl_1.customer, tbl_2.order FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.c_id = tbl_2.c_id WHERE tbl_1.cash > 100
البته این صرفا مثال است، در صورت تمایل ساختار نمونه دیتابیستان را به صورت فرمت sql به آدرس ایمیل ما (موجود در بخش تماس) به همراه توضیحات و خروجی مورد انتظار ارسال کنید تا بررسی گردد.رحیمی
۱۳:۵۶ ۱۳۹۸/۱۲/۲۶
با سلام
ضمن تشکر از آموزش بسیار خوب شما
لطفا بفرمایید وقتی دو جدول با هم لفت جوین می شوند همانطور که فرمودید بدلیل لفت جوین شدن امکان وجود سطر خالی در جدول دوم وجود دارد، حالا اگر خواسته باشیم بدون اینکه دو جدول را انییر جوین کنیم با یک شرط سطرهای خالی جدول دوم را انتخاب کنیم چه دستوری باید بکار ببریم
ضمن تشکر از آموزش بسیار خوب شما
لطفا بفرمایید وقتی دو جدول با هم لفت جوین می شوند همانطور که فرمودید بدلیل لفت جوین شدن امکان وجود سطر خالی در جدول دوم وجود دارد، حالا اگر خواسته باشیم بدون اینکه دو جدول را انییر جوین کنیم با یک شرط سطرهای خالی جدول دوم را انتخاب کنیم چه دستوری باید بکار ببریم
لطفا سوال را به همراه نمونه ساختار دو جدول فرضی مطرح و مشخص کنید نتیچه مد نظرتان به چه نحوی باید باشد، با توجه به توضیحات اگر هدف صرفا انتخاب مواردی است که ستون جدول دوم به صورت NULL است نمونه پرس و جوی زیر کاربرد دارد:
SELECT tbl_1.num AS row_1, tbl_2.num AS row_2 FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.num = tbl_2.num WHERE tbl_2.num IS NULL
نکته: با توجه به هدفتان ممکن است دستور LEFT JOIN گزینه مناسبی نباشد و با دستورات دیگری بتوانیم به هدف دست پیدا کنیم که با تعیین دقیق ساختار دیتابیس و نتیجه مورد انتظار شکل پرس و جوی لازم مشخص می شود.نوید
۱۲:۰۰ ۱۳۹۶/۰۶/۰۵
سلام
میخواستم بدونم میشه ما بین 3 الی 4 تا جدول هم join کرد؟ اگر میشه به چه شکلی و سینتکسی
ممنونم
میخواستم بدونم میشه ما بین 3 الی 4 تا جدول هم join کرد؟ اگر میشه به چه شکلی و سینتکسی
ممنونم
لطفا به این آدرس مراجعه کنید:
http://www.blokeish.com/2011/08/join-sql-multiple-3-4-tables-mysql/
واحد
۰۹:۳۵ ۱۳۹۶/۰۳/۲۱
سلام
من سه جدول دارم که یکی برای ذخیره خودرو یکی برای ذخیره املاک و دیگری برای ذخیره لوازم الکتریکی دارم. می خواهم اطلاعات را از این سه جدول بگیرم و بر اساس تاریخ درج مرتب کنم. لطفا من را راهنمایی کنید.
خیلی ممنون
من سه جدول دارم که یکی برای ذخیره خودرو یکی برای ذخیره املاک و دیگری برای ذخیره لوازم الکتریکی دارم. می خواهم اطلاعات را از این سه جدول بگیرم و بر اساس تاریخ درج مرتب کنم. لطفا من را راهنمایی کنید.
خیلی ممنون
در حالت کلی و اگر دریافت تمام اطلاعات مد نظر باشد باید از الگوی نمونه کد زیر پیروی کنید:
SELECT col_item, col_date
FROM table_1
UNION ALL
SELECT col_item, col_date
FROM table_2
UNION ALL
SELECT col_item, col_date
FROM table_3
ORDER BY col_date DESC
امیرحسین
۰۰:۱۶ ۱۳۹۶/۰۲/۲۱
سلام استاد عزیز
یه سوال داشتم اگر جواب بدید خیلی لطف میکنید
من میخوام از دستور where در join ها هم استفاده کنم ترتیبشون چگونه است
یه سوال داشتم اگر جواب بدید خیلی لطف میکنید
من میخوام از دستور where در join ها هم استفاده کنم ترتیبشون چگونه است
SELECT tbl_attr.title,tbl_product_attr.value FROM tbl_attr LEFT JOIN tbl_product_attr ON tbl_attr.id = tbl_product_attr.idattr
SELECT tbl_attr.title,tbl_product_attr.value FROM tbl_attr @where LEFT JOIN tbl_product_attr ON tbl_attr.id = tbl_product_attr.idattr
SELECT tbl_attr.title,tbl_product_attr.value FROM tbl_attr LEFT JOIN tbl_product_attr @where ON tbl_attr.id = tbl_product_attr.idattr
SELECT tbl_attr.title,tbl_product_attr.value FROM tbl_attr LEFT JOIN tbl_product_attr ON tbl_attr.id = tbl_product_attr.idattr @WHERE
به این WHERE ها دقت کنید که از دستی @ گذاشتم که رنگش آبی بشه مشخص بشه در کجا میتوانم استفاده کنم ایا بعد از FROM یا بعد از JOIN مربوطه یا بعد از ON یا قبلش ایا سه بار میشه از WHERE استفاده کرد یعنی هم برای FROM هم برای JOIN و ترتیبشون رو هم ذکر کنید که مثلا یه دستور JOIN دارم ترتیب های where,on,having را ذکر کنید.پارامتر WHERE باید در پایان پرس و جو بیاید، اگر نیاز به اعمال شرط های بیشتر باشد، در کنار WHERE از AND و OR استفاده کنید، HAVING برای مواردی است که از GROUP BY استفاده می کنیم و مانند WHERE باید در پایان پرس و جو بیاید، مثال:
SELECT tbl_1.id, tbl_1.name, tbl_2.age
FROM tbl_1
LEFT JOIN tbl_2 ON tbl_1.id = tbl_2.id
GROUP BY tbl_1.id
HAVING tbl_2.age > 20
SELECT tbl_1.id, tbl_1.name, tbl_2.age
FROM tbl_1
LEFT JOIN tbl_2 ON tbl_1.id = tbl_2.id
WHERE tbl_2.age > 20
AND tbl_2.age != 55
LIMIT 0 , 30
۱۷:۵۰ ۱۳۹۵/۰۳/۰۴
ممنون از مطالب خوبتون
پریسا
۱۲:۰۱ ۱۳۹۴/۰۲/۲۷
سلام
با تشکر از جوابهای مفیدتون. این بار یه سوال کلی تری دارم
اگر بخوام به این جدول جدید اسم بدم که بعدن دوباره ازش استفاده کنم ؛ مثلا مرتب کنم یا هر کار دیگه چه باید کنم؟
خودم عبارت زیر رو استفاده کردم اما جواب نداد
با تشکر از جوابهای مفیدتون. این بار یه سوال کلی تری دارم
اگر بخوام به این جدول جدید اسم بدم که بعدن دوباره ازش استفاده کنم ؛ مثلا مرتب کنم یا هر کار دیگه چه باید کنم؟
خودم عبارت زیر رو استفاده کردم اما جواب نداد
SELECT tbl_1.name, tbl_2.count FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.skill = tbl_2.language as MY_NEW_TABLE
سلام
برای استفاده از نام مستعار (alias) برای جداول یا ستون ها در MySQL، عبارت "AS" یا باید بعد از ستون مورد نظر درج گردد و یا بعد از قسمت FROM، آموزش و مثال:
برای استفاده از نام مستعار (alias) برای جداول یا ستون ها در MySQL، عبارت "AS" یا باید بعد از ستون مورد نظر درج گردد و یا بعد از قسمت FROM، آموزش و مثال:
http://clivern.com/learning-mysql-aliases
پریسا
۱۰:۲۳ ۱۳۹۴/۰۲/۲۳
سلام بازم ممنون از حوصله ای که به خرج میدید. ولی در بخش ابتدایی فقط این قسمت بود:
SELECT tbl_1.skill, tbl_2.count FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.id = tbl_2.count
حالا من میخوام به این جدول اسم بدم یا اینکه سطر مشخصی از tbl_1.id = tbl_2.count رو انتخاب کنم ؛ مثلا میشه بنویسم: ON tbl_1.id = tbl_2.count = 2
سلام
- منظور از بخش ابتدایی آموزش، قسمت ساخت جدول و همچنین INNER JOIN است.
- عبارت tbl_1 و... در واقع نام انتخابی جداول هستند که می تواند با توجه به نام جداول شما هر چیز دیگری باشد.
- برای اجرای یک پرس و جوی صحیح باید شیوه نگارش دستورات MySQL را رعایت کنید، لذا حالت مد نظر شما به صورت نمونه زیر با استفاده از WHERE قابل اعمال است:
- منظور از بخش ابتدایی آموزش، قسمت ساخت جدول و همچنین INNER JOIN است.
- عبارت tbl_1 و... در واقع نام انتخابی جداول هستند که می تواند با توجه به نام جداول شما هر چیز دیگری باشد.
- برای اجرای یک پرس و جوی صحیح باید شیوه نگارش دستورات MySQL را رعایت کنید، لذا حالت مد نظر شما به صورت نمونه زیر با استفاده از WHERE قابل اعمال است:
SELECT tbl_1.name, tbl_2.count FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.skill = tbl_2.language WHERE tbl_1.id = 1
پریسا
۱۳:۳۲ ۱۳۹۴/۰۲/۲۲
با سلام
من دو جدول دارم که فقط ستون ID آنها برابر است و میخوام چند ستون مشخص از جدول اول و چند ستون مشخص از جدول دوم رو انتخاب کنم و سطر مشخصی از این ستونهای انتخاب شده رو چاپ کنم. (مثلا از این ستونها فقط سطر ID=2 رو میخوام انتخاب کنم).
و یک سوال دیگه اینکه وقتی دو جدول رو جوین کردیم چطوری به این جدول جوین شده اسم بدیم که بتونیم دوباره ازش استفاده کنیم
با تشکر.
من دو جدول دارم که فقط ستون ID آنها برابر است و میخوام چند ستون مشخص از جدول اول و چند ستون مشخص از جدول دوم رو انتخاب کنم و سطر مشخصی از این ستونهای انتخاب شده رو چاپ کنم. (مثلا از این ستونها فقط سطر ID=2 رو میخوام انتخاب کنم).
و یک سوال دیگه اینکه وقتی دو جدول رو جوین کردیم چطوری به این جدول جوین شده اسم بدیم که بتونیم دوباره ازش استفاده کنیم
با تشکر.
سلام
لطفا بخش ابتدایی آموزش و هچنین قسمت مربوط به INNER JOIN را مطالعه کنید، دقیقا مطابق با نیاز شما و همراه با مثال است!
لطفا بخش ابتدایی آموزش و هچنین قسمت مربوط به INNER JOIN را مطالعه کنید، دقیقا مطابق با نیاز شما و همراه با مثال است!
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.