मैं निम्न तालिका क्वेरी करने के बारे में उलझन में हूं। मैं केवल यह बताना चाहता हूं कि किसी विशिष्ट तिथि को कितने का आदेश दिया गया और प्राप्त किया गया।
कैलेंडर टेबल
id | date
1 | 2013-07-01
2 | 2013-07-02
3 | 2013-07-03
4 | 2013-07-04
5 | 2013-07-05
6 | 2013-07-06
7 | 2013-07-07
phone_details तालिका
id | dateOrdered | dateReceived | upg
1 | 2013-07-01 | 2013-07-05 | exp
2 | 2013-07-02 | 2013-07-05 | post
3 | 2013-07-02 | 2013-07-06 | upgrade
4 | 2013-07-07 | 2013-07-07 | upggrade
5 | 2013-07-03 | 2013-07-04 | exp
6 | 2013-07-01 | 2013-07-02 | exp
मैं क्या परिणाम चाहूंगा।
calendar.date | noOrdered | noReceived | # of post | # of exp | # of upgrade
2013-07-01 | 2 | | | 2 |
2013-07-02 | 2 | 1 | 1 | | 1
2013-07-03 | 1 | | | 1 |
2013-07-04 | | 1 | | |
2013-07-05 | | 2 | | |
2013-07-06 | | 1 | | |
2013-07-07 | 1 | 1 | | 1 |
मेरी क्वेरी यहां दी गई है:
select calendar.date,DAYNAME(calendar.date) as `day`,
sum(if((`phone_details`.`upg` = "Post"),1,0)) AS `Post Paid`,
sum(if((`phone_details`.`upg` = "Upgrade"),1,0)) AS `Upgrade`,
sum(if(((`phone_details`.`upg` = "Exp") or (`phone_details`.`upg` = "Future Exp")),1,0)) AS `Exp`,
(select count(phone_ID) FROM phone_details
WHERE dateReceived = calendar.date
)AS `received`
from `phone_details` JOIN calendar
where calendar.date = phone_details.dateOrdered
group by calendar.date DESC
इस क्वेरी के साथ समस्या है अगर वहाँ हैकिसी तिथि पर कुछ भी आदेश नहीं दिया गया है, यह इसे परिणाम पर प्रदर्शित नहीं करता है, भले ही उस तिथि को कोई प्राप्त हुआ हो, फिर भी यह प्रदर्शित नहीं होता है। मेरा परिणाम केवल ऊपर की बजाय नीचे दी गई तालिका जैसा दिखता है। यदि मैं प्रत्येक कॉलम को वश में कर लेता हूं, तो मैं जो परिणाम चाहता हूं, उसका उत्पादन करने में सक्षम हूं, लेकिन प्रसंस्करण समय काफी धीमा लगता है।
calendar.date | noOrdered | noReceived | # of post | # of exp | # of upgrade
2013-07-01 | 2 | | | 2 |
2013-07-02 | 2 | 1 | 1 | | 1
2013-07-03 | 1 | | | 1 |
2013-07-07 | 1 | 1 | | 1 |
कुछ मार्गदर्शन की सराहना की जाएगी। बहुत बहुत धन्यवाद।
उत्तर:
उत्तर № 1 के लिए 4आप एक चाहते हैं LEFT JOIN
में प्रत्येक पंक्ति के लिए परिणाम उत्पन्न करने के लिए calendar
भले ही वे आपके कुछ भी मेल नहीं खाते हों phone_details
तालिका;
SELECT c.date "calendar_date",
SUM(c.date=pd.dateOrdered) noOrdered,
SUM(c.date=pd.dateReceived) noReceived,
SUM(c.date=pd.dateOrdered AND upg="post") "# of post",
SUM(c.date=pd.dateOrdered AND upg="exp") "# of exp",
SUM(c.date=pd.dateOrdered AND upg="upgrade") "# of upgrade"
FROM calendar c
LEFT JOIN phone_details pd
ON c.date = pd.dateOrdered
OR c.date = pd.dateReceived
GROUP BY c.date;
परीक्षण करने के लिए एक SQLfiddle.
जवाब के लिए 0 № 2
मुझे नहीं लगता कि आपका जुड़ाव सही है क्योंकि आपको एक का उपयोग करना चाहिए और कहां नहीं:
from `phone_details` JOIN calendar
where calendar.date = phone_details.dateOrdered
उपयोग करने का प्रयास करें:
from `phone_details` JOIN calendar
on calendar.date = phone_details.dateOrdered
उत्तर № 3 के लिए -1
select calendar.date,DAYNAME(calendar.date) as `day`,
sum(if((`phone_details`.`upg` = "Post"),1,0)) AS `Post Paid`,
sum(if((`phone_details`.`upg` = "Upgrade"),1,0)) AS `Upgrade`,
sum(if(((`phone_details`.`upg` = "Exp") or (`phone_details`.`upg` = "Future Exp")),1,0)) AS `Exp`,
(select count(id) FROM phone_details
WHERE dateReceived = calendar.date
)AS `received`
from `phone_details` JOIN calendar
ON calendar.date = phone_details.dateOrdered or calendar.date = phone_details.dateReceived
group by calendar.date DESC
यह ठीक काम करता है। आप यहाँ देख सकते हैं http://sqlfiddle.com/#!2/2b9ca/3