কেন আমি explain অসম্ভব কোথায় পাওয়া যাচ্ছি কনস্টিট টেবিলগুলি পড়ার পরে?


27

টেবিলে আমার কাছে একটি অনন্য যৌগিক কী রয়েছে (বিড, টোয়াইট), যখন আমি ব্যাখ্যা দিয়ে ক্যোয়ারি চালাই আমি নিম্নলিখিত ফলাফলটি পাই:

Impossible WHERE noticed after reading const tables`

আমি যে ক্যোয়ারীটি চালিয়েছি:

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

কোন সাহায্য?

সম্পাদনা 1:
যখন আমি নীচের কোয়েরিটি ব্যবহার করি:

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

সম্পাদনা 3: যেমন মাইএসকিএল
সাইট বলে:

অসম্ভব যেখানে কনস্ট্ট টেবিলগুলি পড়ার পরে লক্ষ্য করা গেছে

মাইএসকিউএল সমস্ত কনস্ট (এবং সিস্টেম) সারণী পড়েছে এবং লক্ষ্য করেছে যে যেখানে বিধিটি সর্বদা মিথ্যা।

তবে ক্যোয়ারিতে আমি যে ফলাফলটি পেতে চাই তা পেয়েছি, WHEREঅংশটি নেই false। এমন কেউ আছেন যিনি এটি ব্যাখ্যা করতে এবং এই বিষয়ে কিছু আলোকপাত করতে পারেন?


কি SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;ফিরবে ???
RolandoMySQLDBA

@ রোল্যান্ডো মাইএসকিউএলডিবিএ, এর using indexপরিবর্তে অতিরিক্ত কিছু থাকবেimpossible...
এএলএইচ

উত্তর:


23

আপনি বার্তা পাচ্ছেন

অসম্ভব যেখানে কনস্ট্ট টেবিলগুলি পড়ার পরে লক্ষ্য করা গেছে

আপনি ইতিমধ্যে সংযুক্ত পৃষ্ঠাটিতে এটি নথিভুক্ত করা হয়েছে ।

মাইএসকিউএল সমস্ত const(এবং system) সারণী পড়েছে এবং লক্ষ্য করেছে যে WHEREধারাটি সর্বদা মিথ্যা

const সারণী হিসাবে সংজ্ঞায়িত করা হয়

সারণীতে সর্বাধিক একের সাথে সারি সারি রয়েছে যা কোয়েরির শুরুতে পড়ে read ... 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'
ALH

1
@ জন.লোক: এটি আপনার তৃতীয় ক্যোয়ারী: 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ᵀᴹ

1
আপনি সারি থাকতে পারে না গুলি করতে পারে। একটি অনন্য প্রতিবন্ধকতা আছে (fromid,toid)তাই একটি সর্বোচ্চ অবশ্যই আছে? এবং আপনি যে বার্তাটি থেকে বলেছেন যে আপনি মাইএসকিউএল পেয়েছেন তা মনে করে না যে এটির একটি রয়েছে। আপনি কি বোঝাতে চেয়েছেন যে আপনার কয়েকটি সারি মিলছে 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'))
ypercubeᵀᴹ

5

মাইএসকিউএল ব্যাখ্যাটি আপনার সরবরাহিত মানগুলিকে আক্ষরিকভাবে সম্পর্কিত টেবিলগুলির সারিগুলি অতিক্রম করতে ব্যবহার করে। আপনি যদি কোনও ধ্রুবক / কী মান সরবরাহ করেন যা সম্পর্কিত সারণীতে নেই, মাইএসকিউএল ব্যাখ্যাটি এই ত্রুটিটি দিয়ে থামবে। যে মানগুলি বিদ্যমান রয়েছে তার জন্য কেবল সম্পর্কিত টেবিল (গুলি) অনুসন্ধান করুন এবং আপনার ব্যাখ্যা কোয়েরিতে যা সরবরাহ করে এবং প্রত্যাশা অনুযায়ী সবকিছুই কাজ করবে।


3
Impossible WHERE noticed ...ত্রুটি নয়। এটি ব্যাখ্যা অংশ।
ypercubeᵀᴹ

3

Impossible WHERE noticed after reading const tables প্রশ্ন জিজ্ঞাসা?

এই ত্রুটিটি কলামে অবৈধ মান স্থাপনের কারণে ঘটে যা প্রাথমিক কী বা অনন্য কী।

ধারাটিতে একটি সঠিক মান দিয়ে চেষ্টা করুন where


0

আমি এই দেরীতে লাফিয়ে যাচ্ছি। তবে এখানে আমি আমার জন্য লক্ষ্য করেছি।

আমি এই ক্যোয়ারীটি করছিলাম এবং আইটেম কলামটি ছিল অনন্য।

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

যা কনস টেবিলগুলি পড়ার পরে অসম্ভবকে লক্ষ্য করবে

আমাকে যা করতে হয়েছিল তা হ'ল "=" "পছন্দ" করতে এবং এটি এখন আমার সূচকটি ব্যবহার করছে।

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

এটি কি সূচকটি ব্যবহার করে না =?
ypercubeᵀᴹ

পর্যাপ্ত পাগল না এটি ছিল না .... এটি কেবল অসম্ভব ব্যাখ্যায়
বোঝাচ্ছিলেন কনস্টের

হ্যাঁ, তবে "অসম্ভব যেখানে" সাধারণত ভাল usually মানে ক্যোয়ারিকে সারণী বা সূচি থেকে আর পড়তে হবে না। এটা কি ধীর ছিল? যদি তা না হয় তবে আপনার মোটেই চিন্তা করা উচিত নয়।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.