2010-04-20 11 views
25

मैं एक मेज इस तरह है:mysql जांच करता है, तो संख्या एक अल्पविराम में हैं अलग की गई सूची

UID(int) NUMBERS(blob) 
---------------------- 
1  1,13,15,20 
2  3,10,15,20 
3  3,15 

और मैं परीक्षण करने के लिए करता है, तो 3 और 15 ब्लॉब बुलाया संख्या में हैं चाहते हैं। और देख सकते हैं की तरह %%

नहीं किया जा सकता केवल आईडी 2 और तीन का चयन किया जा scoulb साथ पंक्ति ...

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/5033047/mysql-query-finding- मूल्य-में-ए-अल्पविराम से अलग-स्ट्रिंग) –

उत्तर

37

यह एक भी काम करता है:

SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS) 

IN का उपयोग करके एक अल्पविराम से अलग स्ट्रिंग जैसे पर गौर करेंगे। अगर यह MySQL में देशी FIND_IN_SET() की सीमा समाप्त करने के लिए किसी को भी

एक विस्तारित कार्य करने के लिए उपयोगी है इन दो

WHERE banana IN ('apple', 'banana', 'coconut') 
WHERE 3 IN (2,3,6,8,90) 

Info found on this page:

+1

बेशक यह मुझे बेवकूफ बनाता है! –

+0

अपने उत्तर को स्वीकार करने के बारे में बुरा महसूस करते हैं क्योंकि दूसरा भी सही था। लेकिन IN find_in_set से अधिक सही लगता है भले ही वह भी काम करेगा। – Tillebeck

+1

वास्तव में सहायक !! – Dharmesh

30
नहीं

सबसे सुंदर समाधान है, लेकिन यह काम करता है:

select 
    UID 
from 
    YOUR_TABLE 
where 
    find_in_set('3', cast(NUMBERS as char)) > 0 
    and 
    find_in_set('15', cast(NUMBERS as char)) > 0 

ध्यान दें कि यह स्ट्रिंग तुलना है, इसलिए आपको अपने इनपुट पैरामीटर को चार में भी डालना होगा।

+0

आपकी सहायता के लिए धन्यवाद। मुझे अल्पविराम से अलग मूल्यों को सहेजने के लिए एक एक्सपैपल वाला एक पृष्ठ मिला। मैंने इसे एक उत्तर के रूप में पोस्ट किया। मान लें कि आपका समाधान ठीक काम करेगा – Tillebeck

+0

एकमात्र समाधान जो मेरे लिए काम करता है। धन्यवाद। –

+1

यह मेरे लिए काम करता था जहां आईएन नहीं था। यहां नमूना है: उन उपयोगकर्ताओं से id चुनें जहां find_in_set (uid, (आलेखों से संपादकों का चयन करें जहां article_id = 123)) –

9

यह भी जांच, इस नए विस्तारित संस्करण FIND_IN_SET_X() एक सूची की तुलना करने के लिए सुविधा प्रदान करता है एक और सूची के साथ।

यानी

mysql> SELECT FIND_IN_SET_X('x,c','a,b,c,d'); -> 3 

Checkout this link for more details.

+1

पोस्ट करने के लिए धन्यवाद। पता नहीं था कि फ़ंक्शन – Tillebeck

+0

कोई भी जानता है कि मुझे इस फ़ंक्शन का विवरण कहां मिल सकता है? मुझे इसके लिए कोई संदर्भ नहीं मिल रहा है और लिंक अब काम नहीं करता है ... – Matthew

+0

मैंने mysql दस्तावेज़ों को इंगित करने के लिए लिंक अपडेट किया है। – Peter

9

आपको निम्न प्रकार के रूप में देख सकते हैं:

SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND FIND_IN_SET('15', NUMBERS) 
0

find_in_set_x

mysql में एक नया कार्य बना सकते हैं और निम्नलिखित में पेस्ट (नहीं मेरी रास्ते से काम)

BEGIN 
DECLARE limitCount INT DEFAULT 0; 
DECLARE counter INT DEFAULT 0; 
DECLARE res INT DEFAULT 0; 
DECLARE temp TEXT; 
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',','')); 
simple_loop:LOOP 
SET counter = counter + 1; 
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList,',',counter),',',-1); 
SET res = FIND_IN_SET(temp,targetList); 
IF res > 0 THEN LEAVE simple_loop; END IF; 
IF counter = limitCount THEN LEAVE simple_loop; END IF; 
END LOOP simple_loop; 
RETURN res; 
END 
3

समारोह पूरा करने के लिए आप

DELIMITER $$ 

CREATE FUNCTION `FIND_IN_SET_X`(inputList TEXT,targetList TEXT) RETURNS INT(11) 
    DETERMINISTIC 
BEGIN 
    DECLARE limitCount INT DEFAULT 0 ; 
    DECLARE counter INT DEFAULT 0 ; 
    DECLARE res INT DEFAULT 0 ; 
    DECLARE temp TEXT ; 
    SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',', '')) ; 
    simple_loop : 
    LOOP 
    SET counter = counter + 1 ; 
    SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList, ',', counter),',',- 1) ; 
    SET res = FIND_IN_SET(temp, targetList) ; 
    IF res > 0 
    THEN LEAVE simple_loop ; 
    END IF ; 
    IF counter = limitCount 
    THEN LEAVE simple_loop ; 
    END IF ; 
    END LOOP simple_loop ; 
    RETURN res ; 
END$$ 

DELIMITER ; 
[एक अल्पविराम से अलग स्ट्रिंग में MySQL क्वेरी खोजने मूल्यों] (की
संबंधित मुद्दे