# پایگاه‌های داده > سایر پایگاه‌های داده > MySQL >  مشکل در inner join

## cnmeysam

سلام یه مشکلی داشتم اگه میشه راهنماییم کنید
من 2 تا تیبل دارم توی دیتا بیسم یکیش مقدار ارسالی رو مشخص میکنه
یکیش هم مقدار دریافتی رو حالا میخوام به کمک inner join یک سری مقادیر رو خارج کنم ولی به مشکل خوردم
این جدول ارساله
tbl_sendbasket.JPG
این هم جدول دریافت
tbl_recivebasket.JPG
میخوام مقادیر نام مشتری نام سبد مقدار ارسالی و مقدار دریافتی و کسر ارسالی از دریافتی رو بیارم توی یک جدول ولی یه مشکلم اینه وقتی جدولی توی دریافت یا ارسال نباشه 2بار نشون میده کل جداول رو
یه مشکلم اینه نمیدونم چطوری بیام جداول ارسالی سبد 3 مشتری با کد 1 رو با هم جمع کنم وبعد از جمع کردن کل جداول دریافتی اون مشتری خاص کم کنم
این کدیه که درست کردم میشه راهنماییم کنید که باید چیکار کنم؟



SELECT tbl_sendbasket.customername, tbl_sendbasket.baskets, tbl_sendbasket.basketnumbers,
tbl_recivebasket.baskets,  tbl_recivebasket.basketnumbers
 
FROM tbl_sendbasket
 
INNER JOIN tbl_recivebasket
 
ON tbl_sendbasket.customername=tbl_recivebasket.custo  mername
 WHERE tbl_sendbasket.customercode = "1"
ORDER BY tbl_sendbasket.ID;


این هم خروجی که میده
return.JPG
 خروجی باید همچین چیزی باشه تو فتوشاپ درست کردم :بامزه: 
Untitled-1.jpg
البته باید اگه مثلا میثم 3تا سبد2 توی ارسال در تاریخهای متفاوت داره اول سبدهای 2 باهم جمع بشه تعدادش بدست بیاد بعد از تعداد سبدهای دریافت کم بشه

----------


## cnmeysam

این کد رو درست کردم ولی هنوز مقدار صفر رو نمیدونم چطور بدست بیارم


SELECT tbl_sendbasket.customername AS "مشتری", tbl_sendbasket.baskets AS "سبد",
 tbl_sendbasket.basketnumbers AS "سبد ارسالی",tbl_recivebasket.basketnumbers AS "سبد دریافتی",
 (tbl_sendbasket.basketnumbers - tbl_recivebasket.basketnumbers) AS "سبد باقی مانده",
  tbl_sendbasket.sender AS "ارسال کننده", tbl_recivebasket.reciver AS "دریافت کننده"
 FROM tbl_sendbasket
 INNER JOIN tbl_recivebasket
 ON tbl_sendbasket.customercode = tbl_recivebasket.customercode 
 WHERE tbl_sendbasket.baskets='سبد' AND tbl_recivebasket.baskets='سبد'

----------


## sajjad.eskandary

باید از کلید خارجی استفاده کنید ... اینکه دو تا فیلد از نوع فارسی رو به هم inner join  بزنید اصلا روش مناسبی نیست ... در مواقع اظطرار از این روش استفاده میکنند .. 
شما می توانید از کلید خارجی استفاده کنید . ساده ترین راه هست

----------


## cnmeysam

سلام
customercode  که بعد از on گذاشتم حروف فارسی نیست کد فروشندست که یک عدد هستش
یعنی من توی برنامه گفتم جاهایی که کد فروشنده یکیه لود بشه یعنی فقط میثم رو لود کنه تا اینجا مشکلی نیست درست لود میکنه
ولی حالا میخوام بگم که وقتی کد فروشنده یکیه و نوع ظرفش سبد 1 هست رو لود کنه ولی ممکنه توی ظروف ارسالی سبد 1 باشه ولی ظروف دریافتی سبد 1 اصلا دریافتی نداشته باشه
یعنی مثلا 100تا سبد 1 اگه گرفته باشه و هیچ سبد 1  پس نداده باشه خروجیش NULL میشه
چیکار کنم که خروجی null نشه بگه ارسالی 100 و دریافتی 0 و 100-0 =100

----------


## sajjad.eskandary

> سلام
> customercode  که بعد از on گذاشتم حروف فارسی نیست کد فروشندست که یک عدد هستش
> یعنی من توی برنامه گفتم جاهایی که کد فروشنده یکیه لود بشه یعنی فقط میثم رو لود کنه تا اینجا مشکلی نیست درست لود میکنه
> ولی حالا میخوام بگم که وقتی کد فروشنده یکیه و نوع ظرفش سبد 1 هست رو لود کنه ولی ممکنه توی ظروف ارسالی سبد 1 باشه ولی ظروف دریافتی سبد 1 اصلا دریافتی نداشته باشه
> یعنی مثلا 100تا سبد 1 اگه گرفته باشه و هیچ سبد 1  پس نداده باشه خروجیش NULL میشه
> چیکار کنم که خروجی null نشه بگه ارسالی 100 و دریافتی 0 و 100-0 =100


به جای inner join  از left join استفاده کنید

----------


## sajjad.eskandary

البته توصیه میکنم یه یک جدول دیگه داشته باشی و از اونجا به این دوتا left join بزنی .. 
اینطوری اگه هر کدوم خالی باشه اون یکی رو میاره

----------


## cnmeysam

ممنون از راهنماییتون
مشکل اینجاست من تازه کارم تا الان با دیتابیس کار نکردم 
میشه همین کد رو برام درست کنید تا بهتر متوجه بشم؟
شرمنده وقتت رو میگیرم بخدا آدم تنبلی نیستم ولی 2روزه هرکاری میکنم خروجی نمیگیرم

----------


## sajjad.eskandary

> ممنون از راهنماییتون
> مشکل اینجاست من تازه کارم تا الان با دیتابیس کار نکردم 
> میشه همین کد رو برام درست کنید تا بهتر متوجه بشم؟
> شرمنده وقتت رو میگیرم بخدا آدم تنبلی نیستم ولی 2روزه هرکاری میکنم خروجی نمیگیرم



SELECT tbl_sendbasket.customername AS "مشتری", tbl_sendbasket.baskets AS "سبد",
 tbl_sendbasket.basketnumbers AS "سبد ارسالی",tbl_recivebasket.basketnumbers AS "سبد دریافتی",
 (tbl_sendbasket.basketnumbers - tbl_recivebasket.basketnumbers) AS "سبد باقی مانده",
  tbl_sendbasket.sender AS "ارسال کننده", tbl_recivebasket.reciver AS "دریافت کننده"
 FROM tbl_customercode
 LEFT JOIN tbl_recivebasket
 ON tbl_customercode.id = tbl_recivebasket.customercode 
 LEFT JOIN tbl_sendbasket
 ON tbl_customercode.id tbl_sendbasket.customercode
 WHERE tbl_sendbasket.baskets='سبد' AND tbl_recivebasket.baskets='سبد'

یک جدول با نام tbl_customercode ایجاد کنید

----------


## cnmeysam

سلام
من تیبل رو ساختم یه id هم بهش دادم 2 تا id هم بهش اضافه کردم 1و2 که با کاستومر کدهام یکی باشه
کد شما اول سینتکس ارور میداد 

ON tbl_customercode.id tbl_sendbasket.customercode

بین اینها یک AND اضافه کردم حل شد
ولی مشکل هنوز پابرجاست
یعنی توی خروجی بجای 1بار برای هر مشتری مثلا 2بار سبد رو لود و محاسبه میکنه این مدلی و برای دومی اعدادش اصلا توی دیتابیس هم نیست
۱.JPG
بعد ممکنه مثلا سبد 2 ارسال شده باشه ولی دریافت نشده باشه مقدار صفر رو نمیذاره برای دریافت حتی null هم نمیاره الان در حالی که مثلا برای سبد2 باید بگه ارسالی 5  دریافتی 0 و 5-0=5
2.JPG

----------


## cnmeysam

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

try {
        String url ="jdbc:mysql://localhost:3306/fixedprices?user=root&password=&useSSL=false&chara  cterEncoding=UTF-8";
            Class.forName("com.mysql.jdbc.Driver").newInstance  ();
            Connection con = DriverManager.getConnection(url);
            Statement st =con.createStatement();
            Statement st1 =con.createStatement();
            Statement st2 =con.createStatement();
            Statement st3 =con.createStatement();
            Statement st5 =con.createStatement();
            Statement st6 =con.createStatement();
            
          int rowcount = -1;
          int rowcount2 = -1;
          int rowcount3 = -1;
          int rowcount4 = -1; 
          ResultSet resultSet = st.executeQuery("select count(basketnumbers) from tbl_sendbasket where baskets='"+txtbasket.getText()+"' AND customername='"+txtname.getText()+" '");
          ResultSet res1Set = st1.executeQuery("select sum(basketnumbers) from tbl_sendbasket where baskets='"+txtbasket.getText()+"' AND customername='"+txtname.getText()+" '");
          ResultSet resultSet2 = st2.executeQuery("select count(basketnumbers) from tbl_recivebasket where baskets='"+txtbasket.getText()+"' AND customername='"+txtname.getText()+" '");
          ResultSet res1Set2 = st3.executeQuery("select sum(basketnumbers) from tbl_recivebasket where baskets='"+txtbasket.getText()+"' AND customername='"+txtname.getText()+" '");
          resultSet.next();
          res1Set.next();
          resultSet2.next();
          res1Set2.next();
                rowcount = resultSet.getInt(1);
                rowcount2 = res1Set.getInt(1);
               
                rowcount3= resultSet2.getInt(1);
                rowcount4= res1Set2.getInt(1);
          if(rowcount > 0){
              
              txtsendcount.setText(Integer.toString(rowcount));
              txtsendbasket.setText(Integer.toString(rowcount2))  ;
              txtcountrecive.setText(Integer.toString(rowcount3)  );
              txtvalrecive.setText(Integer.toString(rowcount4));
          }
          if(rowcount3 > 0){
              
              txtsendcount.setText(Integer.toString(rowcount));
              txtsendbasket.setText(Integer.toString(rowcount2))  ;
              txtcountrecive.setText(Integer.toString(rowcount3)  );
              txtvalrecive.setText(Integer.toString(rowcount4));
          }else{
              int val = 0;
              ResultSet resSet = st5.executeQuery("select count(basketnumbers) from tbl_sendbasket where baskets='"+txtbasket.getText()+"' AND customername='"+txtname.getText()+"' ");
              txtsendcount.setText(Integer.toString(val));
              resSet.next();
                val= resSet.getInt(1);
              txtsendbasket.setText(Integer.toString(val));
              
              int val1 = 0;
              ResultSet resSet2 = st6.executeQuery("select count(basketnumbers) from tbl_recivebasket where baskets='"+txtbasket.getText()+"' AND customername='"+txtname.getText()+"' ");
              txtcountrecive.setText(Integer.toString(val1));
              resSet2.next();
                val1= resSet2.getInt(1);
              txtvalrecive.setText(Integer.toString(val1));
          }
          String a = txtsendbasket.getText();
          String b = txtvalrecive.getText();
          int c = Integer.parseInt(a)-Integer.parseInt(b);
          txtsum.setText(Integer.toString(c));
          }catch (Exception ex)
        {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }



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

----------


## cnmeysam

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



من 2تا تیبل دارم یکیش tbl_send و یکیش هم tbl_receive 
برای send ستونهای به این شکل دارم
customercode و baskets و basketnumbers

وبرای receive هم همین ستونها رو دارم یعنی
customercode و baskets و basketnumbers

حالا ممکنه برای یک مشتری با کد یه سبد ارسال کنم یعنی توی جدول سند این جوری میشه
1- سبد خالی 10
و برای مشتری دیگه با کد جدید سبد دیگه ای رو ارسال کنم یعنی این مدلی
2- سبد پر 50
و توی قسمت تیبل دریافت فقط مشتری شماره 1 تعدادی سبد رو پس فرستاده باشه مثلا 7 تاش رو
سوال اینجاست اول چطوری همه محصولات ارسالی و دریافتی رو یکجا ببینم که مشخص باشه مثلا مشتری 1- از من 10 تا سبد خالی گرفته و 7 تا هم پس داده و محاسبه کنم 10-7=3 تا باقی مانده
و دوم مشتری 2- از من 50 تا سبد پر گرفته و چیزی پس نفرستاده و توی خروجی نمایش بده و محاسبه کنه 50-0=50 تا باقی مانده
در اصل 2تا کد نیاز دارم
یکیش باید طبق توضیح بالا همه انواع سبد رو نمایش بده
یکیش هم مثلا فقط سبدهای خالی رو نمایش بده

----------


## cnmeysam

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

select customercode,customername,baskets,SUM(sendnumber) as sumsend,Sum(recnumber) as sumrecive,SUM(sendnumber)-Sum(recnumber) as mandeh from (select 1 askind,ID,customercode,customername,baskets,basket  numbers as sendnumber,0 as recnumber from tbl_sendbasket UNION SELECT 2 as kind,ID,customercode,customername,baskets,0,basket  numbersFROM tbl_recivebasket ) k group by customercode,customername ,baskets

----------

