PDA

View Full Version : مشکل در inner join



cnmeysam
سه شنبه 30 آبان 1396, 03:29 صبح
سلام یه مشکلی داشتم اگه میشه راهنماییم کنید
من 2 تا تیبل دارم توی دیتا بیسم یکیش مقدار ارسالی رو مشخص میکنه
یکیش هم مقدار دریافتی رو حالا میخوام به کمک inner join یک سری مقادیر رو خارج کنم ولی به مشکل خوردم
این جدول ارساله
147100
این هم جدول دریافت
147102
میخوام مقادیر نام مشتری نام سبد مقدار ارسالی و مقدار دریافتی و کسر ارسالی از دریافتی رو بیارم توی یک جدول ولی یه مشکلم اینه وقتی جدولی توی دریافت یا ارسال نباشه 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;


این هم خروجی که میده
147103
خروجی باید همچین چیزی باشه تو فتوشاپ درست کردم:بامزه:
147104
البته باید اگه مثلا میثم 3تا سبد2 توی ارسال در تاریخهای متفاوت داره اول سبدهای 2 باهم جمع بشه تعدادش بدست بیاد بعد از تعداد سبدهای دریافت کم بشه

cnmeysam
سه شنبه 30 آبان 1396, 04:11 صبح
این کد رو درست کردم ولی هنوز مقدار صفر رو نمیدونم چطور بدست بیارم


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
سه شنبه 30 آبان 1396, 07:56 صبح
باید از کلید خارجی استفاده کنید ... اینکه دو تا فیلد از نوع فارسی رو به هم inner join بزنید اصلا روش مناسبی نیست ... در مواقع اظطرار از این روش استفاده میکنند ..
شما می توانید از کلید خارجی استفاده کنید . ساده ترین راه هست

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

sajjad.eskandary
سه شنبه 30 آبان 1396, 15:14 عصر
سلام
customercode که بعد از on گذاشتم حروف فارسی نیست کد فروشندست که یک عدد هستش
یعنی من توی برنامه گفتم جاهایی که کد فروشنده یکیه لود بشه یعنی فقط میثم رو لود کنه تا اینجا مشکلی نیست درست لود میکنه
ولی حالا میخوام بگم که وقتی کد فروشنده یکیه و نوع ظرفش سبد 1 هست رو لود کنه ولی ممکنه توی ظروف ارسالی سبد 1 باشه ولی ظروف دریافتی سبد 1 اصلا دریافتی نداشته باشه
یعنی مثلا 100تا سبد 1 اگه گرفته باشه و هیچ سبد 1 پس نداده باشه خروجیش NULL میشه
چیکار کنم که خروجی null نشه بگه ارسالی 100 و دریافتی 0 و 100-0 =100

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

sajjad.eskandary
سه شنبه 30 آبان 1396, 15:18 عصر
البته توصیه میکنم یه یک جدول دیگه داشته باشی و از اونجا به این دوتا left join بزنی ..
اینطوری اگه هر کدوم خالی باشه اون یکی رو میاره

cnmeysam
سه شنبه 30 آبان 1396, 15:45 عصر
ممنون از راهنماییتون
مشکل اینجاست من تازه کارم تا الان با دیتابیس کار نکردم
میشه همین کد رو برام درست کنید تا بهتر متوجه بشم؟
شرمنده وقتت رو میگیرم بخدا آدم تنبلی نیستم ولی 2روزه هرکاری میکنم خروجی نمیگیرم

sajjad.eskandary
سه شنبه 30 آبان 1396, 16:27 عصر
ممنون از راهنماییتون
مشکل اینجاست من تازه کارم تا الان با دیتابیس کار نکردم
میشه همین کد رو برام درست کنید تا بهتر متوجه بشم؟
شرمنده وقتت رو میگیرم بخدا آدم تنبلی نیستم ولی 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
سه شنبه 30 آبان 1396, 16:50 عصر
سلام
من تیبل رو ساختم یه id هم بهش دادم 2 تا id هم بهش اضافه کردم 1و2 که با کاستومر کدهام یکی باشه
کد شما اول سینتکس ارور میداد

ON tbl_customercode.id tbl_sendbasket.customercode

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

cnmeysam
سه شنبه 30 آبان 1396, 16:52 عصر
نا گفته نمونه توی خود جاوا این مشکل رو این ملی حل کردم

try {
String url ="jdbc:mysql://localhost:3306/fixedprices?user=root&password=&useSSL=false&characterEncoding=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
چهارشنبه 01 آذر 1396, 02:44 صبح
همون سوال رو با روش و توضیح کامل تری میپرسم شاید متوجه منظورم بشید



من 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
چهارشنبه 01 آذر 1396, 19:19 عصر
ممنون از اینکه هرچند کم ولی راهنمایی کردین
به کمک یکی از دوستای خوبم جواب رو پیدا کردم در اصل باید از 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