PDA

View Full Version : حرفه ای: استفاده از join برای جدول هایی با تعداد ردیف متفاوت



omidabedi
جمعه 25 مهر 1393, 22:11 عصر
با سلام

برای select کردن در 2 جدول که یک فیلد یکسان دارن (user_id) (که هردو فیلد کلید خارجی هستند) از join استفاده کردم

مشکل اینجاست که جوابی که برمیگردونه بدلیل اینکه تعداد ردیف ذو جدول متفاوت هست از جدولی که ردیف کمتری داره داده های تکراری برمیگردونه تا به تعداد جدول دیگر برسه

چیزی که خودم امتحان کردم:

1- استفاده از دو select جداگانه بدون دستور join که همانند join عمل کرد و خروجی تکراری برگرداند

SELECT * FROM (SELECT ...) as a,(SELECT ...) as b



پ.ن: از union هم میشه استفاده کرد اما میشه با join کردن هم اینکارو کرد؟

پ.ن2:منظور از join همون inner join هست

nazanin_asadi_1
شنبه 26 مهر 1393, 11:13 صبح
اینجوری که از واژه تعداد ردیف های متفاوت بر میاد ارتباط شما یک ارتباط یک به چند هستش و خب کجای این مورد مشکل دارید ؟

مثلا یک جدول دارید با نام tuser که مشخصات مشتری رو توش مینویسی
و یک جدول داری که فاکتورهای مشتری ها رو توش ذخیره میکنی

خب این اتباط یک به چند هستش و اگه join کنی به اعزای هر فاکتور مشخصات مشتری رو هم باید بیاره مگر این که شما مثلا نیاز باشه که جمع یا تعداد فاکتور ها رو بخواین join میزنین و از دستور group by و غیره استفاده میکنید اینجوری به اعزای هر مشتری تعداد فاکتور یا جمع مبلغ فاکتورها رو براتون میاره

الان معلوم نکردین مشکل شما کجاست و چیه و چه کاری میخواین بکنین چه هدفی دارین

omidabedi
شنبه 26 مهر 1393, 18:53 عصر
اینجوری که از واژه تعداد ردیف های متفاوت بر میاد ارتباط شما یک ارتباط یک به چند هستش و خب کجای این مورد مشکل دارید ؟

مثلا یک جدول دارید با نام tuser که مشخصات مشتری رو توش مینویسی
و یک جدول داری که فاکتورهای مشتری ها رو توش ذخیره میکنی

خب این اتباط یک به چند هستش و اگه join کنی به اعزای هر فاکتور مشخصات مشتری رو هم باید بیاره مگر این که شما مثلا نیاز باشه که جمع یا تعداد فاکتور ها رو بخواین join میزنین و از دستور group by و غیره استفاده میکنید اینجوری به اعزای هر مشتری تعداد فاکتور یا جمع مبلغ فاکتورها رو براتون میاره

الان معلوم نکردین مشکل شما کجاست و چیه و چه کاری میخواین بکنین چه هدفی دارین

اصن اینارو در نظر نگیرید ایا درست هست که دوتا جدول رو که یک فیلد مشترک (user_id) که بصورت foreign key هستن (primary key در این بین وجود ندارد) توسط join باهم join کنیم؟تعداد رکورد در دو جدول متفاوت هست

چیزی که من به نتیجه رسیدم این بوده که وفتی اینارو باهم join میکنیم جدولی که رکورد کمتری داره بجای رکورد هاش نسبت به جدول دوم,رکورد تکراری بر میگردونه مشکل اینه!

یعنی جدول یک 5 تا رکورد داره جدول دو 10 تا رکورد,نتیجه که بر میگردونه 5 تا رکورد از جدول یک تکراری برمیگردونه چگونه کاری کنیم که داده ی تکراری بر نگردونه ؟

nazanin_asadi_1
شنبه 26 مهر 1393, 19:33 عصر
چیزی که من به نتیجه رسیدم این بوده که وفتی اینارو باهم join میکنیم جدولی که رکورد کمتری داره بجای رکورد هاش نسبت به جدول دوم,رکورد تکراری بر میگردونه مشکل اینه!

یعنی جدول یک 5 تا رکورد داره جدول دو 10 تا رکورد,نتیجه که بر میگردونه 5 تا رکورد از جدول یک تکراری برمیگردونه چگونه کاری کنیم که داده ی تکراری بر نگردونه ؟
اینی که گفتید اصلا مشکل نمیشه بهش گفت

شما هدفتون رو مشخص نکردین که دنبال چی هستین

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

bagherok
شنبه 26 مهر 1393, 21:55 عصر
یه query رو دو جدول که هردو یه فیلد یکسان دارند و کلید خارجی هستند و تعدا سطرهای متفاوت دارند زدم اما چیزی که شما میگید رخ نداد.
درصورت امکان نمونه ساختار2 جدولتون رو اینجا قرار بدید sqlfiddle.com
وهمراه query تون

omidabedi
یک شنبه 27 مهر 1393, 11:08 صبح
جدول 1:

+----+-------+------------+---------------------+---------+
| id | field | field 2 | date | user_id |
+----+-------+------------+---------------------+---------+
| 1 | 17 | 40 | 2014-10-17 18:23:51 | 1 |
| 2 | 19 | 63 | 2014-10-17 18:43:02 | 1 |
+----+-------+------------+---------------------+---------+


جدول 2:

+----+---------+---------------------+-------+
| id | user_id | date | field |
+----+---------+---------------------+-------+
| 8 | 1 | 2014-09-10 10:52:34 | 10 |
| 9 | 1 | 2014-09-10 10:53:33 | 10 |
| 10 | 1 | 2014-09-10 11:01:32 | 20 |
| 11 | 1 | 2014-09-10 13:17:22 | 10 |
+----+---------+---------------------+-------+


میخوام با join برام اطلاعات این دو جدول رو برگردونه ON user_id=user_id
چگونه؟

الان وقتی inner join میکنم از جدول یک 2تا رکورد تکراری برمیگردونه

یک نکته: کلا این دوتا جدول باهم هیچ رابطه ای ندارن یعنی قاعدتا استفاده از join اشتباست یعنی باید از union استفاده کزد

چرا که در join به ازای هر رکورد میگرده دنبال رکوردی در جدول دیگه که شرط ON براشون true میشه (این از اشتباه اولم که گیر دادم به join)

ایا میشه کوئری ای نوشت که داده های تکراری رو برنگردونه؟(البته اینجا هیچ فیلد unique نداریم!اگر where رو بزاریم روی مثلا date ممکن هست دوتا رکورد متفاوت که date برابر دارن رو یکی بیاره)

چکاره دیگه ای جز union میشه انجام داد ایا؟

omidabedi
یک شنبه 27 مهر 1393, 11:17 صبح
حالا join اینجوری عمل میکنه

اخه با 2 تا select هم همینجوری میاره :|

کوئری:

SELECT * FROM (SELECT * FROM table 1 WHERE 1) a,(SELECT * FROM table 2 WHERE 1) b WHERE a.user_id = b.user_id


چیزی که برمیگردونه:

+----+---------+---------------------+----+---------+---------------------+
| id | user_id | date | id | user_id | date |
+----+---------+---------------------+----+---------+---------------------+
| 1 | 1 | 2014-10-17 18:23:51 | 8 | 1 | 2014-09-10 10:52:34 |
| 2 | 1 | 2014-10-17 18:43:02 | 8 | 1 | 2014-09-10 10:52:34 |
| 1 | 1 | 2014-10-17 18:23:51 | 9 | 1 | 2014-09-10 10:53:33 |
| 2 | 1 | 2014-10-17 18:43:02 | 9 | 1 | 2014-09-10 10:53:33 |
| 1 | 1 | 2014-10-17 18:23:51 | 10 | 1 | 2014-09-10 11:01:32 |
| 2 | 1 | 2014-10-17 18:43:02 | 10 | 1 | 2014-09-10 11:01:32 |
| 1 | 1 | 2014-10-17 18:23:51 | 11 | 1 | 2014-09-10 13:17:22 |
| 2 | 1 | 2014-10-17 18:43:02 | 11 | 1 | 2014-09-10 13:17:22 |
+----+---------+---------------------+----+---------+---------------------+


البته اینم معنی join رو میده ها اما خب چکارش کنم درست شه :|

کامروا
یک شنبه 27 مهر 1393, 11:39 صبح
چیزی که میخوایی برگردونه هم بصورت جدول نشون بده...

cpuram
یک شنبه 27 مهر 1393, 11:50 صبح
من این کوئری رو استفاده کردم برای دو جدول خیلی عالی کار میکنه.
SELECT table1.*,table2.* FROM table1,table2 WHERE table1.tkt_uid=table2.user_id AND table2.tkt_open=0

bagherok
یک شنبه 27 مهر 1393, 12:18 عصر
خوب با unoin باشه چه مشکلی داره
درضمن تو خروجی هم دادهای تکراری هم ندارید

cpuram
یک شنبه 27 مهر 1393, 13:23 عصر
خوب با unoin باشه چه مشکلی داره
درضمن تو خروجی هم دادهای تکراری هم ندارید

unoin ؟ لطفا مثال بزنین برای دو جدول.

omidabedi
یک شنبه 27 مهر 1393, 13:28 عصر
اره خب میشه با union درستش کرد یعنی در واقع باید با union باشه

اما خب این بعنوان یه چالش رو مخم بوده از دیروز که چجوری اینو با join بدست بیارم :|

اگر یک فیلد unique داشت میشد توی where محدودش کرد اما نداره

گفتم شاید بشه جوری نوشتش که duplicate content نیاره

بهرحال مرسی همگی

شما برای اینجور کارها از چه کوئری ای استفاده میکنید؟

تبادل اطلاعات و سبک های کوئری نویسی خیلی کمک میکنه به نوشتن کوئری های پیشرفته

omidabedi
یک شنبه 27 مهر 1393, 13:37 عصر
بعد union احساس میکنم خیلیی یواشه یعنی برای حجم اطلاعات درخواستی واقعا یواش هست

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

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

bagherok
یک شنبه 27 مهر 1393, 13:47 عصر
unoin ؟ لطفا مثال بزنین برای دو جدول.
بیخیال حالا یه u جابجا شده
آسمون که به زمین نیومدهhttp://barnamenevis.org/images/smilies/yahoo/109.gif
به جای اینکه query خودتونو بذارید(که خروجی مورد نظر رو نداره)
جوابی بدید که مشکل دستمون حل بشه
union

http://dev.mysql.com/doc/refman/5.0/en/union.html

(http://dev.mysql.com/doc/refman/5.0/en/union.html)

cpuram
یک شنبه 27 مهر 1393, 14:20 عصر
بیخیال حالا یه u جابجا شده
آسمون که به زمین نیومده:لبخند:
به جای اینکه query خودتونو بذارید(که خروجی مورد نظر رو نداره)
جوابی بدید که مشکل دستمون حل بشه
union

http://dev.mysql.com/doc/refman/5.0/en/union.html

(http://dev.mysql.com/doc/refman/5.0/en/union.html)

چرا میزنی؟:D من اصلا متوجه نشدم املاش غلط بود منظورم این بودبا اون نمیشه فیلدهای دو جدول رو به هم ربط داد جوابی هم دادم درسته باید تست کنه.

bagherok
یک شنبه 27 مهر 1393, 14:44 عصر
چیزی رو که دقیقا مدنظرتون هست رو متوجه نمیشم و اینکه ساختار جداولتون
و هیچ وقت به این مورد برنخوردم.
و اینکه تو خروجی نهایی که قرار دادید 2 مقدار یونیک در هر سطر وجود داره
فک میکنم ساختار جداولتون نیاز به تغییر داره.

و نیازی نمیبینم برای join یا ترکیب
هرکدومو جداگونه نمایش بدید

omidabedi
یک شنبه 27 مهر 1393, 16:50 عصر
چرا میزنی؟:D من اصلا متوجه نشدم املاش غلط بود منظورم این بودبا اون نمیشه فیلدهای دو جدول رو به هم ربط داد جوابی هم دادم درسته باید تست کنه.

function مغز خیلی جالبه
:لبخند:
منم متوجه غلط املایی نشدم

خیلی باحاله انگار مغرم کش داره منتها کش تصویری :متفکر:

شکل کلیه یک کلمه رو ذخیره میکنه بعد هرجا که دیدش میخونتش بدونه اینکه بدونه دقیقا همونه یا خیر واسه همین توی خوندن کلمات به زبان فارسی ما سرعتمون خیلی بیشتر از خودندن

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

omidabedi
یک شنبه 27 مهر 1393, 17:03 عصر
چیزی رو که دقیقا مدنظرتون هست رو متوجه نمیشم و اینکه ساختار جداولتون
و هیچ وقت به این مورد برنخوردم.
و اینکه تو خروجی نهایی که قرار دادید 2 مقدار یونیک در هر سطر وجود داره
فک میکنم ساختار جداولتون نیاز به تغییر داره.

و نیازی نمیبینم برای join یا ترکیب
هرکدومو جداگونه نمایش بدید

میخوام با یک کوئری اطلاعات رو بصورت تفکیک شده از توی 2 تا جدول بیرون بیارم و مهم هست که توی یک کوئری باشه

میشه با دوتا کوئری انجام داد

اما خب در واقع من 6تا جدول دارم که باید به این صورت اطلاعات رو واکشی کنم این یعنی 6تا کوئری و 6تا کانکشن و از طرفی باید بیام توی php اینارو مرتب کنم

همین داده های تکراری هم میشه اومد توی php حذفش کرد و اما خب یعنی برنامه اضافه کار اضافه

کلا یک چیزی که من توی کارام در نظر میگیرم اینه که نمیام مشکل رو دور بزنم بلکه حلش میکنم که همیشه باعث شده چیزای جدیدی یاد بگیرم سرچ های جدیدی کنم

وگرنه همه چیزو میشه دور زد و هیچ وقت با union و join و sort و.... نیاز پیدا نکرد و توی php مثلا اینارو درست کرد اما خب دور زدن همیشه یک هزینه هایی رو در بر داره

ساختار جداول مشکلی نداره برای اینکه join کار کنه میتونم روی جدول users که primary key این جداول هست کوئری بزنم و با join اطلاعات رو بگیرم و درستشم همینه

اینم که دارم روی join کردن روی جدول 1 اصرار (اسرار :| ) میکنم واسه کنجکاوی و چالش ذهنیه خودم هست که ببینم چگونه میشه کوئری های منعطف تری رو ساخت منظورم اینه که مثلا میشه کوئری که نوشتم

که داده های تکراری برمیگردونه رو جوری تغییر داد و محدود کرد که اگر یک رکورد یکبار وحود داره دیگه نیارتش یه چیزی مثل WHERE IF IS UNIQUE

nazanin_asadi_1
یک شنبه 27 مهر 1393, 17:31 عصر
جدول 1:

+----+-------+------------+---------------------+---------+
| id | field | field 2 | date | user_id |
+----+-------+------------+---------------------+---------+
| 1 | 17 | 40 | 2014-10-17 18:23:51 | 1 |
| 2 | 19 | 63 | 2014-10-17 18:43:02 | 1 |
+----+-------+------------+---------------------+---------+


جدول 2:

+----+---------+---------------------+-------+
| id | user_id | date | field |
+----+---------+---------------------+-------+
| 8 | 1 | 2014-09-10 10:52:34 | 10 |
| 9 | 1 | 2014-09-10 10:53:33 | 10 |
| 10 | 1 | 2014-09-10 11:01:32 | 20 |
| 11 | 1 | 2014-09-10 13:17:22 | 10 |
+----+---------+---------------------+-------+


میخوام با join برام اطلاعات این دو جدول رو برگردونه ON user_id=user_id
چگونه؟


بعضی وقتا بعضی ها رو می شه دید که کاملا چسبیدن به دیوار و دارن هی زور میزنن که برن جلو راه یکیست و آن هم راه مستقیم

شما اصلا دقیقا توضیح ندادید دنبال چی هستید

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

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

کدوم خروجی مد نظرتونه ؟
شما بر اساس این دوتا جدولی که گذاشتین خروجی که مد نظرتون هست رو هم بزارین تا بشه فهمید چی به چیه

omidabedi
یک شنبه 27 مهر 1393, 22:06 عصر
بعضی وقتا بعضی ها رو می شه دید که کاملا چسبیدن به دیوار و دارن هی زور میزنن که برن جلو راه یکیست و آن هم راه مستقیم

شما اصلا دقیقا توضیح ندادید دنبال چی هستید

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

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

کدوم خروجی مد نظرتونه ؟
شما بر اساس این دوتا جدولی که گذاشتین خروجی که مد نظرتون هست رو هم بزارین تا بشه فهمید چی به چیه

:| میخوام کوئری ای بنویسم که فیلد های این دو جدول رو برام برگردونه هر تعداد رکوردی که داره رو برگردونه جاهایی که user_id شون برابر باشه

نمیدونم مشکل از نوشتن من هست یا خوندن شما

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

cpuram
یک شنبه 27 مهر 1393, 22:58 عصر
:| میخوام کوئری ای بنویسم که فیلد های این دو جدول رو برام برگردونه هر تعداد رکوردی که داره رو برگردونه جاهایی که user_id شون برابر باشه

نمیدونم مشکل از نوشتن من هست یا خوندن شما

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

کوئری منو تست کردید؟

omidabedi
یک شنبه 27 مهر 1393, 23:58 عصر
کوئری منو تست کردید؟

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

اتفاقا کوعری (با گوشیم همزرو پیدا نمیکنم :| ) شما تنها پست مفید این تاپیک بود
مرسی

cpuram
دوشنبه 28 مهر 1393, 00:02 صبح
با join اینجا یه مثال زده مشابه همون هست.
http://www.w3schools.com/sql/sql_join.asp

کامروا
دوشنبه 28 مهر 1393, 13:18 عصر
اول اینکه این سوال مربوط به بخش دیتابیس هست نه PHP !
بعدشم سوالایی که مربوط به گرفتن Query و این چیزاس، بهتره Output مورد انتظارمون رو هم نشون بدیم. درسته که توی متن توضیح دادید ولی بهتره که جدولش رو هم بکشید تا درکش ساده تر باشه.

کلا این 3 تا کوئری هیچ فرقی باهم ندارن 3تاشون دارن CROSS JOIN(ضرب دکارتی) انجام میدن:
1)

SELECT * FROM (SELECT * FROM tbl_one) as a, (SELECT * FROM tbl_two) as b WHERE a.user_id = b.user_id

2)

SELECT * FROM tbl_one, tbl_two WHERE tbl_one.user_id = tbl_two.user_id


3)
نکته: چون مقادیر user_id در دو جدول یکسانه، INNER JOIN هم دقیقا مثل CROSS JOIN عمل میکنه توی این مورد.

SELECT * from tbl_one INNER JOIN tbl_two ON tbl_one.user_id = tbl_two.user_id




پ.ن: از union هم میشه استفاده کرد اما میشه با join کردن هم اینکارو کرد؟

خیر.

کلا چیزی که من همیشه واسه خودم در نظر میگیرم، اینه که UNION واسه ادغام سطرهای چند جدول و JOIN واسه ادغام ستون های چند جدول هست.

omidabedi
دوشنبه 28 مهر 1393, 18:55 عصر
اول اینکه این سوال مربوط به بخش دیتابیس هست نه PHP !
بعدشم سوالایی که مربوط به گرفتن Query و این چیزاس، بهتره Output مورد انتظارمون رو هم نشون بدیم. درسته که توی متن توضیح دادید ولی بهتره که جدولش رو هم بکشید تا درکش ساده تر باشه.

کلا این 3 تا کوئری هیچ فرقی باهم ندارن 3تاشون دارن CROSS JOIN(ضرب دکارتی) انجام میدن:
1)

SELECT * FROM (SELECT * FROM tbl_one) as a, (SELECT * FROM tbl_two) as b WHERE a.user_id = b.user_id

2)

SELECT * FROM tbl_one, tbl_two WHERE tbl_one.user_id = tbl_two.user_id


3)
نکته: چون مقادیر user_id در دو جدول یکسانه، INNER JOIN هم دقیقا مثل CROSS JOIN عمل میکنه توی این مورد.

SELECT * from tbl_one INNER JOIN tbl_two ON tbl_one.user_id = tbl_two.user_id



خیر.

کلا چیزی که من همیشه واسه خودم در نظر میگیرم، اینه که UNION واسه ادغام سطرهای چند جدول و JOIN واسه ادغام ستون های چند جدول هست.

php و mysql بخشی جدانشدنی هستند

اینجا هم community بزرگتری داره نسبت به بخش mysql واسه همین اینجا مطرح کردم

من توی تاپیک های خارجی دیدم که مورد مشابه خودم رو با join نتیجه گرفتن و بجای رکورد تکراری NULL برمیگردونه اما با توابع این کار اشنا نیستم و حتی نحوه ی نوشتنشون

اره دقیقا مثل cross join عمل میکنه چون فیلد unique نداره که on رو بر اساس اون تعریف کنیم یا where رو.

خروجی دلخواه منم اینه:


+----+---------+---------------------+-------+----+-------+------------+---------------------+---------+
| id | user_id | date | field | id | field | field 2 | date | user_id |
+----+---------+---------------------+-------+----+-------+------------+---------------------+---------+
| 8 | 1 | 2014-09-10 10:52:34 | 10 | 1 | 17 | 40 | 2014-10-17 18:23:51 | 1 |
| 9 | 1 | 2014-09-10 10:53:33 | 10 | 2 | 19 | 63 | 2014-10-17 18:43:02 | 1 |
| 10 | 1 | 2014-09-10 11:01:32 | 20 |NULL| NULL | NULL | NULL | NULL |
| 11 | 1 | 2014-09-10 13:17:22 | 10 |NULL| NULL | NULL | NULL | NULL |
+----+---------+---------------------+-------+----+-------+------------+---------------------+---------+

omidabedi
دوشنبه 28 مهر 1393, 19:14 عصر
در ضمن فرق UNION و JOIN هم اینه که:اول نباید مقایسه کرد چرا که UNION داده ها رو باهم ادغام میکنه و بر میگردونه و دوم اینکه UNION حتما باید فیلدهایی که میخوایم ادغام کنیم از لحاظ type یکی باشند و سوم اینکه باهم برابر باشند یعنی اگر میخوایم 4تا فیلد از اولی بیاره حتکا باید 4تا فیلد مشابه از لحاظ type هم از جدول دومی براش درنظر بگیریم تا درست کار کنه که این یعنی محدودیت واسه همین همه جا استفاده نمیشه.

اما JOIN هم طبق تعریف کاربردیش برای ادغام کردن دو یا چند جدول بصورت یکجا برای جداولی که با هم ارتباط منطقی دارن یعنی همون foreign key و primary key (واسه همین گفتم توی case من اشتباه هست استفاده از join چون ربطی ندارند بهم این جداول,اما میتونم روی جدول users که primary این دوتا جدول هست از join استفاده کنم)

برعکس چیزی که فرمودید JOIN برای برگرداندن ردیف جداول هست یعنی همون رکورد ها و کلا دسته بندی ردیف و ستونی که برای تفکیک join و union ارائه دادید اشتباه هست

کامروا
دوشنبه 28 مهر 1393, 20:08 عصر
در ضمن فرق UNION و JOIN هم اینه که:اول نباید مقایسه کرد چرا که UNION داده ها رو باهم ادغام میکنه و بر میگردونه و دوم اینکه UNION حتما باید فیلدهایی که میخوایم ادغام کنیم از لحاظ type یکی باشند و سوم اینکه باهم برابر باشند یعنی اگر میخوایم 4تا فیلد از اولی بیاره حتکا باید 4تا فیلد مشابه از لحاظ type هم از جدول دومی براش درنظر بگیریم تا درست کار کنه که این یعنی محدودیت واسه همین همه جا استفاده نمیشه.

لزوما به این شکل نیست. شما اگر تعداد ستون های تون با هم یکی نیست، میتونید به جدولی که ستون کمتری داره، ستون NULL یا... اضافه کنید. در واقع شما میتونید فیلدی که نوعش int هست رو با فیلدی که نوعش date هست رو توی یک ستون قرار بدید. و اینکه برنامه درست کار کنه یا نه به شما برمیگرده!



اما JOIN هم طبق تعریف کاربردیش برای ادغام کردن دو یا چند جدول بصورت یکجا برای جداولی که با هم ارتباط منطقی دارن یعنی همون foreign key و primary key (واسه همین گفتم توی case من اشتباه هست استفاده از join چون ربطی ندارند بهم این جداول,اما میتونم روی جدول users که primary این دوتا جدول هست از join استفاده کنم)

برعکس چیزی که فرمودید JOIN برای برگرداندن ردیف جداول هست یعنی همون رکورد ها و کلا دسته بندی ردیف و ستونی که برای تفکیک join و union ارائه دادید اشتباه هست

JOIN واسه برگردوندن رکورد نیست. JOIN برای برقراری رابطه بین ستون های جداول هست. اون دستور SELECT هستش که برای برگرداندن سطر با ستون های مشخص استفاده میشه ولی خب با شرایط JOINی که واسش تعریف کردیم. پس عملا JOIN داره روی ستون کار میکنه نه سطر!

omidabedi
دوشنبه 28 مهر 1393, 20:30 عصر
لزوما به این شکل نیست. شما اگر تعداد ستون های تون با هم یکی نیست، میتونید به جدولی که ستون کمتری داره، ستون NULL یا... اضافه کنید. در واقع شما میتونید فیلدی که نوعش int هست رو با فیلدی که نوعش date هست رو توی یک ستون قرار بدید. و اینکه برنامه درست کار کنه یا نه به شما برمیگرده!


JOIN واسه برگردوندن رکورد نیست. JOIN برای برقراری رابطه بین ستون های جداول هست. اون دستور SELECT هستش که برای برگرداندن سطر با ستون های مشخص استفاده میشه ولی خب با شرایط JOINی که واسش تعریف کردیم. پس عملا JOIN داره روی ستون کار میکنه نه سطر!

!!! یعنی بیام برا یک جدول ستون الکی و خالی بسازم که unionم کار کنه؟!

این غلطیم که گرفتید غلط نگارشی هست وگرنه هم شما هم من میدونیم که همه ی اینا SELECT هستند.و از طرفی JOIN برای ایجاد رابطه نیست توی دستور SELECT,رابطه رو که ما خودمون بصورت foreign key و
primary key تعریف میکنیم

حالا اینارو بیخیال شید توی متن نوشتاری همیشه اینجور غلطها هست و نمیشه منظور و لحن رو کامل رسوند

الان من outputی رو که میخواستم گذاشتم لطفا بمن در این راستا کمک کنید 3> 3>

کامروا
دوشنبه 28 مهر 1393, 22:05 عصر
!!! یعنی بیام برا یک جدول ستون الکی و خالی بسازم که unionم کار کنه؟!

بله. اینقدر عجیبه!؟ :لبخندساده:


الان من outputی رو که میخواستم گذاشتم لطفا بمن در این راستا کمک کنید 3> 3>

فرض میکنیم که تعداد سطرهای جدول table1 بیشتر از جدول table2 هست.
دو ستون به نام rn میسازیم که نقش Key Generator رو بازی کنن!:اشتباه:

SELECT t1.*, t2.*
FROM (SELECT t1i.*, (@rn1 := @rn1 + 1) AS rn
FROM table1 t1i CROSS JOIN (SELECT @rn1 := 0) vars
) t1 LEFT JOIN
(SELECT t2i.*, (@rn2 := @rn2 + 1) AS rn
FROM table2 t2i CROSS JOIN (SELECT @rn2 := 0) vars
) t2
ON t1.rn = t2.rn;

این خروجی که شما نیاز دارید رو بهتون میده و همچنین ۲ ستون rn هم بهتون نشون میده که اگر نمیخواین نمایش داده بشه، توی t1 و t2 تک تک اسم ستون ها رو ببرید.

omidabedi
دوشنبه 28 مهر 1393, 22:48 عصر
اره این درست کار میکنه اما مشکلی که داره اینه که همیشه بر اساس شرط جدول 1 دارای رکورد بیشتری نسبت به جدول 2 باشه

توی case من 6 تا table هست و معلوم نیست کدومشون چندتا رکورد دارن و متغییر هستن شاید یه موقع table1 کمتر از table2 باشه

در ضمن کوئریتون هم خلاقانه بود مرسی