/ / mysql क्वेरी परिणाम कुछ पंक्तियों को प्रदर्शित नहीं कर रहा है - mysql

mysql क्वेरी परिणाम कुछ पंक्तियों को प्रदर्शित नहीं कर रहा है - mysql

मैं निम्न तालिका क्वेरी करने के बारे में उलझन में हूं। मैं केवल यह बताना चाहता हूं कि किसी विशिष्ट तिथि को कितने का आदेश दिया गया और प्राप्त किया गया।

कैलेंडर टेबल

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