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

विशिष्ट उपयोगकर्ता MySQL के लिए एक ही तालिका में दिनांक सीमा ओवरलैप खोजें

यहां पहला भाग है:प्रति उपयोगकर्ता कारों को ओवरलैप करना...

SQLFiddle - सहसंबद्ध क्वेरी और जॉइन क्वेरी

दूसरा भाग - एक ही समय में एक कार में एक से अधिक उपयोगकर्ता:SQLFiddle - सहसंबद्ध क्वेरी और शामिल हों प्रश्न . नीचे प्रश्न...

मैं सहसंबद्ध प्रश्नों का उपयोग करता हूं:

आपको उपयोगकर्ता आईडी और 'कार' पर इंडेक्स की आवश्यकता होगी। हालाँकि - यह देखने के लिए कि यह mysql डेटा तक कैसे पहुँच रहा है, कृपया 'व्याख्या योजना' की जाँच करें। और बस इसे आज़माएं :)

प्रति उपयोगकर्ता कारों को ओवरलैप करना

प्रश्न:

SELECT `allCars`.`userid`  AS `allCars_userid`, 
       `allCars`.`car`     AS `allCars_car`, 
       `allCars`.`From`    AS `allCars_From`, 
       `allCars`.`To`      AS `allCars_To`,
       `allCars`.`tableid` AS `allCars_id`
 FROM  
       `cars` AS `allCars`
 WHERE 
     EXISTS  
         (SELECT 1       
          FROM `cars` AS `overlapCar`            
          WHERE 
               `allCars`.`userid` = `overlapCar`.`userid` 
           AND `allCars`.`tableid` <> `overlapCar`.`tableid`          
           AND NOT (   `allCars`.`From`  >= `overlapCar`.`To`      /* starts after outer ends  */  
                    OR `allCars`.`To`    <= `overlapCar`.`From`))  /* ends before outer starts */
 ORDER BY
        `allCars`.`userid`, 
        `allCars`.`From`, 
        `allCars`.`car`;      

परिणाम:

allCars_userid  allCars_car  allCars_From  allCars_To  allCars_id  
--------------  -----------  ------------  ----------  ------------
             1  Navara       2015-03-01    2015-03-31             3
             1  GTR          2015-03-28    2015-04-30             4
             1  Skyline      2015-04-29    2015-05-31             9
             2  Aygo         2015-03-01    2015-03-31             7
             2  206          2015-03-29    2015-04-30             8
             2  Skyline      2015-04-29    2015-05-31            10

यह क्यों काम करता है? या मैं इसके बारे में कैसे सोचता हूं:

मैं सहसंबद्ध क्वेरी का उपयोग करता हूं इसलिए मेरे पास निपटने के लिए डुप्लीकेट नहीं हैं और शायद यह मेरे लिए समझना सबसे आसान है। प्रश्न को व्यक्त करने के अन्य तरीके हैं। प्रत्येक के फायदे और कमियां हैं। मुझे कुछ ऐसा चाहिए जिसे मैं आसानी से समझ सकूं।

आवश्यकता:प्रत्येक उपयोगकर्ता के लिए सुनिश्चित करें कि उनके पास एक ही समय में दो या अधिक कारें न हों।

इसलिए, प्रत्येक उपयोगकर्ता रिकॉर्ड (AllCars) के लिए पूरी तालिका (ओवरलैपकार) की जांच करके देखें कि क्या आप भिन्न पा सकते हैं रिकॉर्ड जो वर्तमान रिकॉर्ड के समय के लिए ओवरलैप होता है। अगर हमें कोई मिल जाता है तो उस मौजूदा रिकॉर्ड का चयन करें जिसकी हम जांच कर रहे हैं (सभी कारों में)।

इसलिए ओवरलैप चेक है:

  • allCars userid और overLap userid वही होना चाहिए

  • allCars कार रिकॉर्ड और overLap कार रिकॉर्ड अलग होना चाहिए

  • allCars समय सीमा और overLap समय सीमा ओवरलैप होनी चाहिए।

    समय सीमा जांच:

    अतिव्यापी समय की जाँच के बजाय सकारात्मक परीक्षणों का उपयोग करें। सबसे आसान तरीका यह जांचना है कि यह ओवरलैप नहीं है, और एक NOT लागू करें इसके लिए।

एक ही समय में एक से अधिक उपयोगकर्ताओं वाली एक कार...

प्रश्न:

SELECT  `allCars`.`car`     AS `allCars_car`,
        `allCars`.`userid`  AS `allCars_userid`,  
        `allCars`.`From`    AS `allCars_From`, 
        `allCars`.`To`      AS `allCars_To`, 
        `allCars`.`tableid` AS `allCars_id`
        
 FROM  
       `cars` AS `allCars`
 WHERE 
     EXISTS  
        (SELECT 1       
         FROM `cars` AS `overlapUser`            
         WHERE 
              `allCars`.`car` = `overlapUser`.`car` 
          AND `allCars`.`tableid` <> `overlapUser`.`tableid`          
          AND NOT (    `allCars`.`From`  >= `overlapUser`.`To`       /* starts after outer ends  */  
                   OR  `allCars`.`To`    <= `overlapUser`.`From`))  /* ends before outer starts */
 ORDER BY
        `allCars`.`car`,      
        `allCars`.`userid`, 
        `allCars`.`From`;

 

परिणाम:

allCars_car  allCars_userid  allCars_From  allCars_To    allCars_id  
-----------  --------------  ------------  ----------  ------------
Skyline                   1  2015-04-29    2015-05-31             9
Skyline                   2  2015-04-29    2015-05-31            10

संपादित करें:

टिप्पणियों के मद्देनजर, @philipxy द्वारा, समय सीमा के बारे में 'से अधिक या बराबर' चेक की आवश्यकता है, मैंने यहां कोड अपडेट किया है। मैंने SQLFiddles को नहीं बदला है ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्वेरी द्वारा समूह के साथ मैसकल मैक्स

  2. mysqli या मरना, क्या इसे मरना है?

  3. एंड्रॉइड एप्लिकेशन में उपयोग करने के लिए PHP एपीआई सुरक्षित करना

  4. उन्नत MySQL शामिल हो रहा है। क्वेरी को तेज करना

  5. शब्द सीमा जैसे भागने के दृश्यों के साथ REGEXP का उपयोग कैसे करें?