Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP/MySQL:डेटाबेस में मॉडल दोहराए जाने वाले ईवेंट लेकिन दिनांक सीमाओं के लिए क्वेरी

मैं id . नामक सिर्फ एक कॉल के साथ एक टैली टेबल बनाऊंगा और उस तालिका को 0 से 500 तक की संख्याओं से भरें। अब हम आसानी से इसका उपयोग थोड़ी देर के लूप का उपयोग करने के बजाय चयन करने के लिए करते हैं।

Id
-------------------------------------
0
1
2
etc...

फिर मैं घटनाओं को Name as varchar . के साथ एक तालिका में संग्रहीत करता हूं , startdate as datetime और repeats as int

Name    | StartDate            |   Repeats
-------------------------------------
Meeting | 2012-12-10 00:00:00  |   7
Lunch   | 2012-12-10 00:00:00  |   1

अब हम दो तिथियों के बीच सभी तिथियों का चयन करने के लिए टैली टेबल का उपयोग कर सकते हैं:

SELECT DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY) as showdate
FROM `tally`
WHERE (DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY)<='2012-12-20 00:00:00')
ORDER BY Id ASC
ShowDate
-------------------------------------
2012-12-09 00:00:00
2012-12-10 00:00:00
2012-12-11 00:00:00
2012-12-12 00:00:00
2012-12-13 00:00:00
2012-12-14 00:00:00
2012-12-15 00:00:00
2012-12-16 00:00:00
2012-12-17 00:00:00
2012-12-18 00:00:00
2012-12-19 00:00:00
2012-12-20 00:00:00

फिर हम इसे इवेंट टेबल पर शामिल करते हैं ताकि स्टार्टडेट और शोडेट के बीच अंतर की गणना की जा सके। हमने इसके परिणामों को repeats . द्वारा विभाजित किया है कॉलम और यदि शेष 0 है , हमारे पास मैच है।

सभी संयुक्त हो जाते हैं:

SELECT E.Id, E.Name, E.StartDate, E.Repeats, A.ShowDate, DATEDIFF(E.StartDate, A.ShowDate) AS diff
FROM events AS E, (
    SELECT DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY) as showdate
    FROM `tally`
    WHERE (DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY)<='2012-12-20 00:00:00')
    ORDER BY Id ASC
) a
WHERE MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats)=0
AND A.ShowDate>=E.StartDate

जिसका परिणाम

. होता है
Id  | Name       |StartDate             | Repeats   | ShowDate              | diff
---------------------------------------------------------------------------------
1   | Meeting    | 2012-12-10 00:00:00  | 7         | 2012-12-10 00:00:00   | 0
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-10 00:00:00   | 0
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-11 00:00:00   | -1
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-12 00:00:00   | -2
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-13 00:00:00   | -3
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-14 00:00:00   | -4
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-15 00:00:00   | -5
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-16 00:00:00   | -6
1   | Meeting    | 2012-12-10 00:00:00  | 7         | 2012-12-17 00:00:00   | -7
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-17 00:00:00   | -7
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-18 00:00:00   | -8
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-19 00:00:00   | -9
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-20 00:00:00   | -10

अब आप चीजों को गति दे सकते हैं (और चाहिए!) उदाहरण के लिए, किसी तालिका में दिनांकों को सीधे संग्रहीत करके ताकि आप दिनांकित के साथ मिलान तालिका का उपयोग करने के बजाय सीधे सभी तिथियों का चयन कर सकें। हर चीज जिसे आप कैश कर सकते हैं और फिर से गणना करने की आवश्यकता नहीं है, वह अच्छी है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एडब्ल्यूएस ऑरोरा:MySQL सर्वर --read-only विकल्प के साथ चल रहा है, इसलिए यह इस कथन को निष्पादित नहीं कर सकता है

  2. MySQL:एक पेज क्या है?

  3. मैं एक MySQL तालिका से डेटा के सभी संयोजन कैसे प्राप्त करूं?

  4. mysql LONGTEXT मान को VARCHAR मान में कनवर्ट करें?

  5. MySQL 8 का विन्यास