MySQL क्वेरी स्ट्रिंग में शामिल है


307

मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं MySQL के साथ एक क्वेरी कैसे बना सकता हूं जो यह जांचता है कि क्या $haystackएक निश्चित कॉलम में मान (स्ट्रिंग ) में कुछ डेटा (स्ट्रिंग $needle) हैं, जैसे:

mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");

PHP में, फ़ंक्शन को कहा जाता है substr($haystack, $needle), इसलिए हो सकता है:

WHERE substr(`column`, '{$needle}')=1

जवाबों:


437

वास्तव में काफी सरल:

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");

%कोई भी वर्ण सेट (कोई नहीं, एक या कई) का वाइल्डकार्ड है। ध्यान दें कि यह बहुत बड़े डेटासेट पर धीमा हो सकता है, इसलिए यदि आपका डेटाबेस बढ़ता है तो आपको फुलटेक्स सूचकांकों का उपयोग करने की आवश्यकता होगी।


1
यह तभी काम करेगा जब आपके द्वारा तैयार क्वेरी का उपयोग किया जाएगा। यदि आप वहां एक वास्तविक स्ट्रिंग का उपयोग कर रहे हैं (उदाहरण के लिए। शराब की साइकल अपग्रेड स्क्रिप्ट) तो नीचे दिए गए INSTR पर विचार करें। ऐसा इसलिए है क्योंकि यदि आपके स्ट्रिंग में% है, तो आप इसके साथ चीजों का मिलान शुरू करेंगे।
रयान

2
मुझे प्रश्नों के बारे में पता है, और फिर भी आज मैं यह जानना चाहता था कि क्या कुछ कॉलम में कुछ मूल्य स्ट्रिंग में मौजूद हैं, मैं इसके लिए googling कर रहा था .. मैंने पहले कभी क्यों नहीं सोचा था ??
सीज़लिंग कोड

1
क्या यह मामला संवेदनशील है?
क्रोधित कीवी

2
@angry_kiwi: column LIKE '...'यह केस असंवेदनशील है, इसके साथ column LIKE BINARY '...'मामला संवेदनशील है
वोल्फ

2
मुझे आश्चर्य है कि LIKEकिसी भी विकल्प की जांच करने का प्रस्ताव है क्योंकि यह ऑपरेटर दो वाइल्डकार्ड वर्णों का उपयोग करता है: %और _। इसका मतलब है कि यदि आपके स्ट्रिंग $ सुई में इस विशेष वर्ण में से एक है तो परिणाम बिल्कुल भी अपेक्षित नहीं हैं। (-1) इस उत्तर के लिए, और (+1) INSTR उत्तर के लिए।
Skrol29

144

उपयोग:

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0

संदर्भ:


निश्चित रूप से INSTR की तुलना में LIKE तेज है?
क्रिस

17
@oedo: निर्भर करता है। LIKE %...%यदि कोई मौजूद है तो एक इंडेक्स का उपयोग नहीं करेगा, इसलिए उन्हें समकक्ष होना चाहिए; LIKE ...%यदि मौजूद है तो एक इंडेक्स का उपयोग करेगा। यदि प्रदर्शन एक वास्तविक चिंता है, तो फुल टेक्स्ट सर्च (FTS) एक बेहतर दृष्टिकोण होगा।
ओएमजी पोनीज़

उत्तम। बस मैं क्या देख रहा था।
एरिक

2
मुझे यह समाधान पसंद है क्योंकि वास्तव में likeऑपरेटर के साथ एक विकल्प के अनुसार चीजों को सॉर्ट करने का कोई तरीका नहीं है । instrएक वाक्यांश के साथ इस तरह का आदेश दिया जा सकता हैselect * from table order by instr(col1,"mystring")
Radacina

मैं एक क्षेत्र में _ खोजना चाहता था और यह काम कर गया। धन्यवाद
Safeer अहमद

53
WHERE `column` LIKE '%$needle%'

2
जब पात्र _ (अंडरस्कोर) खोज रहा हो, तो क्वेरी '% _%' से काम नहीं करता है, किसी कारण से यह बिना तार के भी सभी रिटर्न लौटा देता है
Wojtek

1
@Wojtek _ किसी भी एकल वर्ण के लिए एक वाइल्डकार्ड है, इसलिए यदि आप शाब्दिक अंडरस्कोर की खोज करना चाहते हैं तो आपको इससे बचने की आवश्यकता होगी। अंडरस्कोर के साथ MySQL LIKE क्वेरी देखें ।
jkmartindale

29

मेरा LOCATEmysql में उपयोग कर रहा है:

LOCATE (पदार्थ, str), LOCATE (पदार्थ, str, स्थिति)

यह फ़ंक्शन मल्टी-बाइट सुरक्षित है, और केवल केस-संवेदी है यदि कम से कम एक तर्क बाइनरी स्ट्रिंग है।

आपके मामले में:

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");

11
'कॉलम' कॉलम होना चाहिए (बिना उद्धरण के)
वोजटेक

10

इसके अलावा @WoLpH से जवाब के साथ।

LIKEकीवर्ड का उपयोग करते समय आपके पास यह भी सीमित करने की क्षमता होती है कि स्ट्रिंग किस दिशा में मेल खाती है। उदाहरण के लिए:

यदि आप एक स्ट्रिंग की तलाश में हैं जो आपके साथ शुरू होती है $needle:

... WHERE column LIKE '{$needle}%'

यदि आप एक स्ट्रिंग की तलाश कर रहे हैं जो इसके साथ समाप्त होती है $needle:

... WHERE column LIKE '%{$needle}'

3

ज्ञात हो कि यह खतरनाक है:

WHERE `column` LIKE '%{$needle}%'

पहले करो:

$needle = mysql_real_escape_string($needle);

इसलिए यह संभावित हमलों को रोक देगा।


7
* कुछ संभावित हमले। इसके अलावा, mysql_real_escape_stringभविष्य के PHP रिलीज में पदावनत होने जा रहा है।
जैक टाक

11
आपको तैयार किए गए कथनों का उपयोग करना चाहिए , और बचने के लिए PHP में जाना चाहिए । $stmt = $dbh->prepare("Where 'column' LIKE '{:needle}'"); $stmt->bindParam(':needle', $needle); $stmt->execute();
बादल फटने

3

आप शायद find_in_setफंक्शन की तलाश में हैं:

Where find_in_set($needle,'column') > 0

यह फ़ंक्शन in_arrayPHP में फ़ंक्शन की तरह कार्य करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.