2011-12-08 13 views
24

ठीक है, इसलिए मेरे पास एक अस्थायी तालिका है जिसमें उपयोगकर्ता आईडी और taskID शामिल है। इसे पूर्ण कार्य कहा जाता है। मेरे पास दूसरी तालिका है जिसमें उपयोगकर्ता आईडी और taskID शामिल है। इसे योजनाबद्ध टास्क कहा जाता है।mysql "कॉल नहीं" दो कॉलम

मुझे पूरा किए गए सभी कार्यदिवसों की एक सूची प्राप्त करने की आवश्यकता है, लेकिन योजनाबद्ध नहीं है। इसलिए, मुझे किसी भी तरह से उन सभी पंक्तियों से बाहर निकालना होगा जहां PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID दोनों हैं।

मुझे आशा है कि यह प्रश्न समझ में आएगा। अगर यह अस्पष्ट है तो कृपया मुझे बताएं और मैं आगे समझाऊंगा।

किसी भी सुझाव के लिए धन्यवाद!

+0

मुझे लगता है कि आपको स्थिति इंगित करने के लिए एक अतिरिक्त कॉलम की आवश्यकता है, वास्तव में दो टेबल की आवश्यकता नहीं है। – ajreal

+0

@ajreal यह एक अच्छा मुद्दा है। शायद मैं सुझाए गए तरीके से स्कीमा को ट्वीव करने पर विचार करूंगा। टिप की सराहना करो! – PFranchise

+1

मैं एक टेबल पर 2 टेबल और एक स्टेटस कॉलम पसंद करता हूं, 99% समय। और एक टेबल पर 11 टेबल और 10 स्टेटस कॉलम। एक क्वेरी को अनुकूलित करना आसान नहीं है जो एक या कई स्टेटस कॉलम (MySQL में) खोजता है। –

उत्तर

62

आप इस (अधिक कॉम्पैक्ट वाक्य रचना) का उपयोग कर सकते हैं:

SELECT * 
FROM CompletedTasks 
WHERE (userID, taskID) NOT IN 
     (SELECT userID, taskID 
     FROM PlannedTasks 
    ) ; 

या NOT EXISTS संस्करण (जो हालांकि अधिक जटिल, उचित अनुक्रमित के साथ अधिक कुशल होना चाहिए):

SELECT c.* 
FROM CompletedTasks AS c 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM PlannedTasks AS p 
     WHERE p.userID = c.userID 
      AND p.taskID = c.taskID 
    ) ; 

और निश्चित रूप से LEFT JOIN/IS NULL संस्करण जो @jmacinnes के उत्तर में है।

+0

बहुत बढ़िया! आपका बहुत बहुत धन्यवाद। मुझे नहीं पता था कि आप इस तरह से दो क्षेत्रों में कहां उपयोग कर सकते थे, लेकिन उम्मीद थी कि यह एक विकल्प होगा। फिर से शुक्रिया आज का दिन अच्छा हो आपके लिए! – PFranchise

+0

मेरे परीक्षणों के बाद, EXISINS संस्करण NOT_IN संस्करण –

+0

@Ka से तेज़ नहीं है। हां, एक tuple के साथ 'IN IN' को 'EXISTS' के रूप में अनुकूलित नहीं किया गया है। आपने किस संस्करण के साथ परीक्षण किया था? मैंने परीक्षण नहीं किया है अगर उन्होंने नए 5.7 संस्करण में अनुकूलक में सुधार किया है। –

5

क्या आपको यह चाहिए?

select ct.* from 
completedTasks ct 
left outer join plannedTasks pt on ct.taskId = pt.TaskId and ct.userId = pt.userId 
where pt.taskId is null 

हालांकि, मैं टिप्पणी के साथ सहमत हूँ - हम क्या सवाल पर एक स्थिति कॉलम दो तालिकाओं की तुलना में बेहतर स्कीमा की तरह लगता है से पता दिया।

0

@ उल्लेख क्वेरी

SELECT * FROM CompletedTasks WHERE (userID, taskID) NOT IN 
     (SELECT userID, taskID FROM PlannedTasks) ;' 

मेरी समस्या हल नीचे साझा करने के लिए ypercubeᵀᴹ धन्यवाद।

+0

यह एक टिप्पणी होनी चाहिए, जवाब नहीं :) :) – sniperd

+0

असल में, मैंने @ypercube साझा क्वेरी के संदर्भ में कुछ बदलाव किया है। भविष्य में ख्याल रखेंगे। धन्यवाद –

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