एक ही विधेय में किसी अन्य अल्पविराम से अलग स्ट्रिंग में किसी भी मान के विरुद्ध अल्पविराम से अलग स्ट्रिंग में किसी भी मूल्य से मेल खाना व्यावहारिक नहीं है।
आप FIND_IN_SET()<का उपयोग कर सकते हैं /ए> एक समय में एक मान की खोज करने के लिए।
इसका मतलब है कि आपको अपने इनपुट $subsector_text
को विभाजित करके प्राप्त होने वाले प्रत्येक मान के लिए एक से अधिक विधेय की आवश्यकता है . तो अपने चर को विभाजित करें और इसे FIND_IN_SET() कॉल की श्रृंखला में मैप करें।
मैंने निम्नलिखित कोड का परीक्षण नहीं किया है, लेकिन इससे आपको पता चल जाएगा कि मैं किस बारे में बात कर रहा हूं:
$subsector_array = array_map('intval', explode(',', $subsector_text));
$subsector_terms = array_map(
function ($id) { return "FIND_IN_SET($id, a.subsector)"; },
$subsector_array);
$subsector_expr = implode(' OR ', $subsector_terms);
$sql = "
SELECT ...
WHERE a.state = 1
AND a.sector = '$sector'
AND ($subsector_expr)
...";
यह निश्चित रूप से एक टेबल-स्कैन को मजबूर करेगा क्योंकि FIND_IN_SET (), या किसी अन्य ऑपरेशन को इंडेक्स करने का कोई तरीका नहीं है जो सबस्ट्रिंग की खोज करता है। ठीक है, मुझे लगता है कि a.state
. पर आपकी शर्तें और a.sector
FIND_IN_SET() शर्तों को लागू करने से पहले खोज को कम करने के लिए एक इंडेक्स का उपयोग करेगा।
मैं उस प्रणाली के साथ काम करने की दुविधा को समझता हूं जो आपको विरासत में मिली है। अपने प्रबंधक को बताएं कि इसे किसी बिंदु पर पुन:सक्रिय करने की आवश्यकता है, क्योंकि यह कभी भी कुशल या विश्वसनीय नहीं होगा जिस तरह से इसे अभी डिज़ाइन किया गया है।