2009-06-15 10 views
17

मैं 'जैसे' और 'पसंद नहीं' वाली क्वेरी करना चाहता हूं।एक mysql क्वेरी में पसंद नहीं है और पसंद नहीं है

वर्तमान उदाहरण: मैं सबकुछ '1 |%' से शुरू करना चाहता हूं लेकिन '1 | 6 | 199 |%' या '1 | 6 | 200 |%' के साथ नहीं।

वर्तमान क्वेरी:

'SELECT * FROM `links` WHERE `category` LIKE '1|%' NOT LIKE '1|6|199|%','1|6|200|%' ORDER BY `score` DESC LIMIT 9'. 

लेकिन वह काम नहीं करता। कोई सुझाव? THX

+1

"काम नहीं करता" थोड़ा और सटीक होना चाहिए। मुझे लगता है कि आपको एक वाक्यविन्यास त्रुटि मिलती है - इस मामले में माइकल हैरेन का आपका समाधान है। –

उत्तर

29

बस जोड़ें "और श्रेणी" ...

SELECT * FROM links 
WHERE category LIKE '1|%' 
    AND category NOT LIKE '1|6|199|%','1|6|200|%' 
ORDER BY score DESC LIMIT 9 

वास्तव में, अल्पविराम हालत अलग एक वाक्य रचना मैं से परिचित हूँ नहीं है। यदि यह काम नहीं कर रहा है, ऐसा करें:

SELECT * FROM links 
WHERE category LIKE '1|%' 
    AND category NOT LIKE '1|6|199|%' 
    AND category NOT LIKE '1|6|200|%' 
ORDER BY score DESC LIMIT 9 
+0

thx! इसने काम कर दिया! हालांकि, निम्नलिखित में क्या गलत है? चुनें * लिंक 'से' श्रेणी 'जैसे' श्रेणी '1 | 6 |%' और 'श्रेणी' जैसा नहीं '1 | 6 | 137 |%', '1 | 6 | 151 |%', '1 | 6 | 118 |% ',' 1 | 6 | 176 |% ',' 1 | 6 | 67 |% ',' 1 | 6 | 199 |% ',' 1 | 6 | 160 |% 'स्कोर' स्कोर 'द्वारा आदेश डीईएससी लिमिटेड 9 ? यह खाली दिखाता है लेकिन इसकी thx नहीं है! –

+0

यदि आप कई बहिष्करण करने के लिए intebd करते हैं, तो मेरा सुझाव है कि आप SUBSTR (श्रेणी, 1, 8) का उपयोग करें (1 | 6 | 137 | ',' 1 | 6 | 151 | ', ...)। –

3

आप regexps उपयोग कर सकते हैं:

SELECT * 
FROM links 
WHERE category LIKE '1|%' 
     AND category NOT REGEXP '^1\\|6\\|(199|200)\\|' 
ORDER BY 
     score DESC 
LIMIT 9 

ध्यान दें कि REGEXP की अनुक्रमणिका का उपयोग नहीं करते, जबकि LIKE करता है।

इस क्वेरी में, LIKE '1|%'category पर सूचकांक का उपयोग कर एक मोटे फ़िल्टर के रूप में कार्य करेगा, जबकि REGEXP के परिणाम ठीक फ़िल्टर करेंगे।

2

मुझे लगता है कि एक बड़ी समस्या यह है कि आपके पास डी-सामान्यीकृत टेबल हैं। सही जवाब आपकी टेबल को सामान्य बनाना होगा।

लेकिन अगर आप ऐसा नहीं कर सकते, तो आप अल्पविरामों और विभाजकों का उपयोग करना चाहिए और इसके बजाय FIND_IN_SET():

WHERE FIND_IN_SET('1', category) > 1 
    AND FIND_IN_SET('6', category) > 1 
    AND FIND_IN_SET('199', category) = 0 
    AND FIND_IN_SET('200', category) = 0 
0

यह भी संभव दो भीतरी में शामिल होने, इस प्रश्न के लिए शायद नहीं सबसे अच्छा समाधान का उपयोग करने के, है, लेकिन अभी भी उपयोगी हो सकता है।

चुनें * लिंक से

अंदरूनी शामिल हों (लिंक से चुनें * कहां श्रेणी '1 | 6 | 199 |%' नहीं की तरह) के रूप में escl1 पर (links.category = escl1.category)

अंदरूनी शामिल हों (लिंक से * का चयन करें जहां श्रेणी पसंद नहीं '1 | 6 | 200 |%') के रूप में escl2 पर (links.category = escl2.category)

कहां श्रेणी की तरह '1 |%'

ऑर्डर score डीईएससी लिमिटेड 9

संबंधित मुद्दे