2012-08-27 9 views
6

संभव डुप्लिकेट:
Calculating total quantity of equipments for a date rangeदी गई तिथि में उपकरणों की कुल राशि summ कैसे पर्वतमाला

परियोजना: मैं एक परियोजना के बारे में जो कुछ कमरों और उपकरणों में उपयोग कर रहा है पर काम कर रहा हूँ कमरे। सॉफ्टवेयर कमरे में उपकरणों को शेड्यूल करने के बारे में है। दूसरे शब्दों में, यह एक आरक्षण सॉफ्टवेयर है जो आवश्यक तिथियों और समय सीमाओं के लिए अलग-अलग कमरों में चयनित उपकरणों को आरक्षित करता है। मेरे पास phs के साथ काम कर रहे MYSSQL डेटाबेस में कई तालिकाओं हैं लेकिन मैं उन प्रश्नों का उल्लेख करूंगा जिनके बारे में मेरा प्रश्न है। जिन टेबलों से मैं अपने प्रश्नों को जोड़ूंगा वे उपकरण तालिका (तालिका ए), अनुसूची तालिका (तालिका बी) और संबंधित अनुसूची (तालिका सी) में उपयोग कर रहे उपकरण हैं।

तालिका A: उपकरण सूची तालिका

+------+----------+-----------+ 
| eqid | eqName | available | 
+------+----------+-----------+ 
| 1 | book  |  90 |  
| 2 | pen  |  82 | 
| 3 | computer |  25 | 
+------+----------+-----------+  

तालिका एक में; eqid एक उपकरण की अद्वितीय आईडी का प्रतिनिधित्व करता है, eqName एक उपकरण के नाम का प्रतिनिधित्व करता है, जो उपलब्ध कुल उपलब्ध उपकरणों का प्रतिनिधित्व करता है।

टेबल बी: अनुसूची तालिका

+------------+------------+------------+-----------+----------+--------+ 
| scheduleid | startDate | endDate | startTime | endTime | office | 
+------------+------------+------------+-----------+----------+--------+ 
|   1 | 2012-08-27 | 2012-08-27 | 08:30:00 | 10:00:00 | room1 | 
|   2 | 2012-08-27 | 2012-08-27 | 09:30:00 | 11:00:00 | room3 | 
|   3 | 2012-08-28 | 2012-08-30 | 08:30:00 | 12:00:00 | room2 | 
|   4 | 2012-08-29 | 2012-08-31 | 11:30:00 | 14:00:00 | room1 | 
|   5 | 2012-08-28 | 2012-08-28 | 10:30:00 | 14:00:00 | room3 | 
|   6 | 2012-08-27 | 2012-08-30 | 08:30:00 | 10:00:00 | room4 | 
|   7 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room4 |  
|   8 | 2012-08-27 | 2012-08-30 | 08:30:00 | 11:00:00 | room6 | 
|   9 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room5 | 
+------------+------------+------------+-----------+----------+--------+  

तालिका बी में; शेड्यूलिड शेड्यूल के लिए अद्वितीय आईडी का प्रतिनिधित्व करता है, स्टार्टडेट और एंडडेट शेड्यूल के लिए दिनांक सीमा, स्टार्टटाइम और एंडटाइम टाइम रेंज शेड्यूल के लिए है, कार्यालय का मतलब है कि शेड्यूल कहाँ होगा। मुझे यहां एक उदाहरण दें। अनुसूची 1 का मतलब है कि 27 अगस्त 2012 को आरक्षण है, सोमवार और यह 08.30 से 10:00 तक है। जैसे ही यह शुरू होता है और उसी दिन समाप्त होता है, यह कमरा 1 में केवल एक दिन का आरक्षण है। हालांकि, अनुसूची 3 का मतलब है कि आरक्षण 2012 के मंगलवार को 28 अगस्त को शुरू होता है और 2012 अगस्त, गुरुवार को 08: 30-12: 00 तक चलता है ... दूसरे शब्दों में, यह 3 दिन और रोजाना रहता है 08:30 से 12:00 ... तो मंगलवार से गुरुवार को 08:30 से 12:00 बजे कमरे 2 में आरक्षण है ... मुझे उम्मीद है कि यह स्पष्ट है।

टेबल सी: संबंधित अनुसूची

+--------+------------+------+-------------+ 
| Autoid | scheduleid | eqid | amountInSch | 
+--------+------------+------+-------------+ 
|  1 |   1 | 1 |   2 |  
|  2 |   1 | 2 |   3 | 
|  3 |   1 | 3 |   1 | 
|  4 |   2 | 1 |   1 | 
|  5 |   2 | 2 |   1 | 
|  6 |   2 | 3 |   2 | 
|  7 |   3 | 2 |   1 | 
|  8 |   3 | 3 |   3 | 
|  9 |   4 | 2 |   1 | 
|  10 |   4 | 3 |   1 | 
|  11 |   5 | 1 |   1 | 
|  12 |   6 | 1 |   1 | 
|  13 |   6 | 3 |   2 | 
|  14 |   6 | 2 |   4 | 
|  15 |   7 | 1 |   5 | 
|  16 |   7 | 2 |   6 | 
|  17 |   8 | 2 |   1 | 
|  18 |   9 | 1 |   8 | 
|  19 |   9 | 2 |   5 | 
|  20 |   9 | 3 |   6 | 
+--------+------------+------+-------------+ 

तालिका सी में इन का उपयोग कर उपकरण: Autoid ऑटो वेतन वृद्धि द्वारा उत्पन्न अद्वितीय स्वचालित आईडी का प्रतिनिधित्व करता है, scheduleid टेबल बी से आता है, eqid तालिका A से आता है, amountInSch कैसे का प्रतिनिधित्व करता है कई (राशि) उपकरण संबंधित कार्यक्रम में उपयोग करेंगे। मैं यहां एक उदाहरण देना चाहता हूं। तालिका सी में अनुसूची 1, 3 पंक्तियां हैं। इसका मतलब है कि टीएबल बी से संबंधित शेड्यूलिड 1 कमरे 1 में निर्दिष्ट तारीखों और समय बी में 2 पुस्तकें (ईकिड 1), 3 पेन (ईकिड 2) और 1 कंप्यूटर (ईकिड 3) का उपयोग करेगा। एक और उदाहरण यह है कि तालिका सी में शेड्यूल 3 3 पंक्तियों से संबंधित है। इसका मतलब है कि 1 पेन (eqId 2) और 3 कंप्यूटर (eqId 3) 2012 के 27 वें से 30 वें अगस्त 2012 से सुबह 08:30 से 12:00 तक कमरे में 2 का उपयोग करेंगे।

उपर्युक्त स्पष्टीकरण है और परियोजना के बारे में कुछ जानकारी देते हैं। तालिका पंक्तियां स्थायी नहीं हैं। जब आप आरक्षण, वहाँ तालिका बी में एक नई पंक्ति हो जाएगा और यदि यह एक उपकरण का चयन किया जाता है, वहाँ मेज सी में नई पंक्तियाँ हो जाएगा ...

प्रश्न:

मैं बाईं गणना करना चाहते हैं जब मैं eqId, startDate, endDate, startTime और endTime की आपूर्ति करता हूं तो एक विशिष्ट उपकरण की मात्रा ...

एक उदाहरण:

eqId: 1 (पुस्तक)

STARTDATE: 2012-08-27

ENDDATE: 2012-08-27

STARTTIME: 08:30:00

eNDTIME: 12:00:00

परिणाम होना चाहिए: 14 पुस्तकों sche में इस्तेमाल किया डुबकी और 76 बाएं उपलब्ध किताबें

क्योंकि: यदि आप शेड्यूल आईडी और संबंधित ईकआईडी देखते हैं, तो आप केवल मेरी क्वेरी (तिथियां और eqId) से संबंधित 1, 2, 6, 7, 9 शेड्यूल देखेंगे। यदि आप तालिका सी में संबंधित सभी राशि को जोड़ते हैं, तो आपको गलत परिणाम मिल जाएगा। दूसरे शब्दों में, eqId (1-पुस्तक) के लिए संबंधित मात्रा और 1, 2, 6, 7, 9 शेड्यूल के लिए क्रमशः 2, 1, 1, 5, 8 हैं। तो यदि आप उन्हें जोड़ते हैं तो आपको 17 मिलेंगे जो गलत है। क्योंकि, 1 और 9 शेड्यूल टाइम्स के अंत और अंत के मामले में एक दूसरे को अंतर नहीं करते हैं, और 6 और 7 एक दूसरे को अलग नहीं करते हैं। उनके परिणामस्वरूप 2 अकेले रहते हैं और अलग-अलग गिन सकते हैं। हमें 8 से 8 के रूप में अवश्य मानना ​​चाहिए क्योंकि 8 2 से बड़ा है। यह 6 और 7 के लिए समान है, 5 की वजह से 5 5 से बड़ा है ...

तो लोग! मुझे यकीन नहीं है कि प्रोग्रामिंग एल्गोरिदम में मैं कैसे/इसे समझा सकता हूं। एसक्यूएल में करने का कोई तरीका है या क्या मुझे PHP और MySQL का एक साथ उपयोग करना है? और कैसे?

SQLFiddle Records

+0

किसी विचार के लिए आने के बिना (इसके बारे में खेद है) ... क्या 'DATE' और 'TIME' कॉलम के बजाय' DATETIME' कॉलम का उपयोग करना आसान नहीं होगा? और फिर: यदि एक शेड्यूल 9:00 से 10:00 बजे तक है और अगला 10:00 से 11:00 बजे तक होगा, तो एक उपकरण का उपयोग करना संभव होगा यदि वे एक ही कमरे में नहीं हैं? आपको उन्हें एक्स से वाई तक ले जाना होगा जो आमतौर पर कुछ समय लेता है। तो हो सकता है कि "छेड़छाड़ न करें" यहां पर्याप्त मजबूत नहीं है। – Jens

+0

@ जेन्स कमरे से कमरे में उपकरणों को ले जाना संभव है। और कार्यक्रमों के बीच ब्रेक होगा। इसे DATE और TIME फ़ील्ड के लिए इस तरह शुरू किया गया था, इसलिए अब इसे बदलना मुश्किल है ... – deepnote

उत्तर

0

इस को प्राप्त करने के कई तरीके हैं - मैं कुछ है कि ज्यादातर डीबी इंजन के साथ इस्तेमाल किया जा सकता पर बताएगा।

mysql में, एक ही क्वेरी में तालिकाओं को मर्ज करना संभव है।

$eqid = 1; 
$startDate = "2012-08-27"; 
$endDate = "2012-08-27"; 
$startTime = "08:30:00"; 
$endTime = "12:00:00"; 
$sql = "SELECT SUM(`amountInSch`) FROM `table_c`,`table_b` WHERE `eqid` = $eqid 
    AND `startDate` >= '$startDate' AND `startDate` <= '$endDate' AND `endDate` 
    <= '$endDate' AND `endDate` >= '$startDate' AND `startTime` >= '$startTime' 
    AND `startTime` <= '$endTime' AND `endTime` <= '$endTime' AND `endTime` >= 
    '$startTime' AND `table_b`.`scheduleid` = `table_c`.`scheduleid`"; 
$r = mysql_query($sql); 
$n = mysql_result($r,0,0); 

चाल (यहाँ मार्कअप करने के लिए कुछ उद्धरण याद कर रहे हैं कारण) दो तालिकाओं को मर्ज करने table_b`.`scheduleid` = `table_c`.`scheduleid उपयोग करने के लिए है: क्या आप की जरूरत है इस की रेखा के साथ कुछ न कुछ है।

+0

यह काम नहीं कर रहा है। जब मैं इस क्वेरी को "तालिका 3' से 'चुनें SUM (' amountInSch'),' तालिका 2 'कहां चलाता हूं, जहां' eqid' = 1 और 'startDate' <=' 2012-08-27 'और' endDate'> = '2012 -08-27 'और' स्टार्टटाइम ' <= '08: 30: 00' और 'एंडटाइम'> = '12: 00: 00' और 'टेबल 2' .chedड्यूलिड' = ' टेबल 3'.चेड्यूलिड ' , इसका परिणाम नल है। और यह मेरे लिए तार्किक प्रतीत नहीं होता है क्योंकि यह केवल SUM राशिInSch फ़ील्ड है। आपको समय छेड़छाड़ करने पर विचार करना चाहिए ... – deepnote

+0

ऐसा लगता है कि मैंने गलती से तर्क फिसल दिया - सभी <= होना चाहिए> = और इसके विपरीत। मैं सही दिखाई देने के लिए उपरोक्त मेरा उत्तर संपादित कर रहा हूं। – ipoga

+0

इसके विपरीत भाग अभी ठीक है लेकिन परिणाम गलत है। यह 14 नहीं 16 होना चाहिए ... – deepnote

संबंधित मुद्दे