व्याख्या क्वेरी में कॉन्स्ट टेबल पढ़ने के बाद मुझे 'असंभव असंभव' क्यों मिल रहा है?


27

मेरे पास तालिका में fr (fromid, toid) की तरह एक अद्वितीय यौगिक कुंजी है, जब मैं प्रश्न पूछता हूं कि मुझे निम्नलिखित प्रश्न मिलते हैं:

Impossible WHERE noticed after reading const tables`

मेरे द्वारा चलाया गया क्वेरी:

explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60   

कोई मदद?

EDIT1:
जब मैं नीचे क्वेरी का उपयोग करता हूं:

explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s'  OR is_approved='f' OR is_approved='t'

मैं USING WHEREपिछले संदेश के बजाय देखता हूं , लेकिन जब मैं नीचे क्वेरी का उपयोग करता हूं:

explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s'  OR is_approved='f' OR is_approved='t')  

मुझे फिर से पहला impossible ...संदेश मिला! ये कोष्ठक यहाँ क्या करते हैं?

EDIT2:

CREATE TABLE `relationship` (
 `rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `fromid` mediumint(8) unsigned NOT NULL,
 `toid` mediumint(8) unsigned NOT NULL,
 `type` tinyint(3) unsigned NOT NULL,
 `is_approved` char(1) NOT NULL,
 PRIMARY KEY (`rid`),
 UNIQUE KEY `fromid` (`fromid`,`toid`),
 KEY `toid` (`toid`),
 CONSTRAINT `relationship_ibfk_1` FOREIGN KEY (`fromid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `relationship_ibfk_2` FOREIGN KEY (`toid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

EDIT3:
जैसा कि mysql साइट कहती है:

कांस्टेबल टेबल पढ़ने के बाद असंभव कहाँ देखा गया

MySQL ने सभी const (और सिस्टम) टेबल को पढ़ा है और देखा है कि WHERE क्लॉज हमेशा गलत होता है।

लेकिन क्वेरी में मुझे वह परिणाम मिलता है जो मैं चाहता हूं, WHEREभाग नहीं है false। क्या कोई ऐसा है जो इस बारे में समझा सकता है और इस विषय पर कुछ प्रकाश डाल सकता है?


क्या SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;लौटा ???
रोलैंडमाइसीडीडीबीए

@ रोलैंडमाइसीडीडीबीए, using indeximpossible...
ALH

जवाबों:


23

आपको संदेश मिल रहा है

कांस्टेबल टेबल पढ़ने के बाद असंभव कहाँ देखा गया

यह आपके द्वारा पहले से लिंक किए गए पृष्ठ में प्रलेखित है ।

MySQL ने सभी const(और system) टेबल पढ़े हैं और ध्यान दें कि WHEREक्लॉज हमेशा गलत होता है

const तालिकाओं के रूप में परिभाषित किया गया है

तालिका में अधिकतम एक मिलान पंक्ति है, जिसे क्वेरी के प्रारंभ में पढ़ा जाता है। ... constका उपयोग तब किया जाता है जब आप एक PRIMARY KEYया UNIQUE सूचकांक के सभी भागों की तुलना निरंतर मूल्यों से करते हैं।

आपके पास एक UNIQUE KEYहै (fromid,toid)WHERE fromid=78 AND toid=60इस विशिष्ट इंडेक्स को पढ़कर क्वेरी को संतुष्ट किया जा सकता है। आपको जो संदेश मिल रहा है, उससे कोई परिणाम नहीं मिलने चाहिए।

इसी तरह क्वेरी WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')भी ब्याज की पंक्ति का पता लगाने के लिए इस सूचकांक का उपयोग कर सकती है (हालांकि यह अभी भी मूल्यांकन करने के लिए अवशिष्ट विधेय है कि मिलान करने के लिए कोई पंक्ति थी)।

आपकी अन्य क्वेरी अलग है

SELECT rid
FROM   relationship
WHERE  fromid = 60
       AND toid = 78
       AND is_approved = 's'
        OR is_approved = 'f'
        OR is_approved = 't' 

ANDकी तुलना में एक उच्च मिसाल है Or, इसलिए यह वैसा ही है

SELECT rid
FROM   relationship
WHERE  ( ( fromid = 60 ) AND ( toid = 78 ) AND ( is_approved = 's' ) )
        OR ( is_approved = 'f' )
        OR ( is_approved = 't' ) 

यह अब उस सूचकांक का उपयोग नहीं कर सकता है और इसमें अलग-अलग शब्दार्थ हैं कि यह किसी भी पंक्तियों को वापस कर देगा, is_approved IN ('f','t')भले ही अन्य स्तंभों में मान क्या हों।


इसलिए मैं उदाहरण के लिए कैसे कहते हैं चाहिए: अगर इसकी fromid=12 AND toid=78फिर अगर जाँच is_approved='f'या is_approved='t'याis_approved='s'
एएलएच

1
@ john.locke: यह आपकी तीसरी क्वेरी है: WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')जिसे इस रूप में भी लिखा जा सकता है:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
ypercube

1
ठीक ठीक। क्योंकि कोई भी पंक्ति fromid=60 AND toid=78भाग से मेल नहीं खाती है, इसलिए आगे की जाँच की आवश्यकता नहीं है ( is_approvedभाग के लिए)।
ypercube y

1
आप पंक्ति नहीं हो सकता रों है कि। वहाँ एक अद्वितीय बाधा है (fromid,toid)तो वहाँ निश्चित रूप से एक अधिकतम होगा? और संदेश से आप कहते हैं कि आप MySQL प्राप्त कर रहे हैं कि ऐसा नहीं है कि वहाँ भी एक है कि करता है। क्या आपका मतलब है कि आपकी कुछ पंक्तियाँ मेल खाती हैं fromid=60और कुछ पंक्तियाँ जो मेल खाती हैं toid=78लेकिन ज़रूरी नहीं कि वही पंक्तियाँ हों?
मार्टिन स्मिथ

1
शायद यही AND-ORभ्रम है । हो सकता है कि आप चाहते हैं सभी पंक्तियों है fromid=60और है कि सभी पंक्तियों toid=78और फिर उन से, केवल उन या तो है कि रखने 's'या 'f'या t'is_approved? यदि हाँ, तो इस स्थिति को WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
आज़माएँ

5

MySql स्पष्ट रूप से संबंधित तालिकाओं की पंक्तियों को पार करने के लिए आपके द्वारा प्रदान किए गए मूल्यों का उपयोग करता है। यदि आप एक निरंतर / मुख्य मान प्रदान करते हैं जो संबद्ध तालिका में नहीं है, तो MySql स्पष्टीकरण इस त्रुटि के साथ बंद हो जाएगा। बस संबंधित तालिका को उन मूल्यों के लिए क्वेरी करें जो मौजूद हैं और जो आपकी व्याख्या क्वेरी में उपलब्ध हैं और सब कुछ उम्मीद के मुताबिक काम करेगा।


3
Impossible WHERE noticed ...कोई त्रुटि नहीं है। यह व्याख्या का हिस्सा है।
ypercube y

3

Impossible WHERE noticed after reading const tables व्याख्या में?

यह त्रुटि अमान्य मान के कारण किसी स्तंभ पर डाली जा रही है जो प्राथमिक कुंजी या विशिष्ट कुंजी है।

whereक्लॉज में एक सही मान के साथ प्रयास करें ।


0

मैं इसमें देरी से कूद रहा हूं। लेकिन यहाँ मेरे लिए क्या देखा है।

मैं यह क्वेरी कर रहा था और आइटम कॉलम UNIQUE था।

SELECT `vari-groupid` FROM shop_item_variations_group where `item` = 'itemnu1' limit 1

जिसे कॉन्स्टेबल टेबल पढ़ने के बाद इम्पॉसिबल WHERE देखा जाएगा

मुझे बस इतना करना था कि "=" को "पसंद" में बदल दिया जाए और यह अब मेरे सूचकांक का उपयोग कर रहा है।

SELECT `vari-groupid` FROM shop_item_variations_group where `item` like 'itemnu1' limit 1

क्या यह सूचकांक का उपयोग नहीं कर रहा था =?
ypercube y

कोई पागल पर्याप्त नहीं था .... यह सिर्फ समझाने में यह कह रहा था असंभव जहां
कॉन्स्टेबल

हां, लेकिन यह "असंभव WHERE" आमतौर पर अच्छा है। इसका मतलब है कि क्वेरी को टेबल या इंडेक्स से अधिक नहीं पढ़ना है। क्या यह धीमा था? यदि नहीं, तो आपको चिंता नहीं करनी चाहिए।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.