यहां पहला भाग है:प्रति उपयोगकर्ता कारों को ओवरलैप करना...
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
को नहीं बदला है ।