2010-08-31 15 views
20

है कि हम खोज का उपयोग कर कीवर्ड का प्रदर्शन मान: KEYWORD1, KEYWORD2, KEYWORD3माइस्क्ल: जैसे आदेश?

वहाँ स्तंभ "नाम" के साथ डेटाबेस में रिकॉर्ड कर रहे हैं:

 
1: John Doe 
2: Samuel Doe 
3: John Smith 
4: Anna Smith 

अब प्रश्न:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%") 

कहीं भी होगी रिकॉर्ड्स का चयन करें: 1,2,3 (इस क्रम में) लेकिन मैं इसे द्वारा क्रमबद्ध करना चाहता हूं उदाहरण में keyword1=John, keyword2=Doe इसलिए इसे कीवर्ड द्वारा सूचीबद्ध किया जाना चाहिए: 1,3,2 (क्योंकि मैं "जॉन" की खोज के बाद "डो" के लिए खोज करना चाहता हूं)

मैं SELECT DISTINCT FROM (...... UNION .....) के बारे में सोच रहा था लेकिन किसी अन्य तरीके से इसे किसी भी तरह से ऑर्डर करना बहुत आसान होगा (असली क्वेरी है वास्तव में लंबा)

क्या ऐसे आदेश बनाने के लिए कोई चाल है?

उत्तर

46
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%" then 2 
    else 3 
end 
+0

हाँ, कि काम करता है, धन्यवाद :) – dfens

+0

एक और बात - अगर मैं यह समझ ठीक से हर तरह निष्पादित किया जाएगा पूरे क्वेरी में 2 बार? – dfens

+0

@dfens: मुझे लगता है कि 'ORDER BY' खंड में 'LIKE' केवल' WHERE 'खंड से मेल खाने वाले डेटा पर निष्पादित होगा, इसलिए तेज़ होना चाहिए। – RedFilter

2
SELECT * 
from 
(
    SELECT u.*, 1 OrderNum 
    FROM users 
    WHERE (name LIKE "%John%") 
    UNION 
    SELECT u.*, 2 OrderNum 
    FROM users 
    WHERE (name LIKE "%Doe%") 
) 
    Order by OrderNum 
2

RedFilter के जवाब पर निर्माण करने के लिए, आप उन पंक्तियों दोनों खोजशब्दों शीर्ष पर होना जरूरी है कि कर सकता है:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2 
when name LIKE "%Doe%" then 3 
end 
0

मेरे उदाहरण वर्णक्रम Doe के बाद John के के सभी आदेश देगा के।

ORDER BY CASE 
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name) 
    WHEN name LIKE "John%" THEN CONCAT('b',name) 
    WHEN name LIKE "%Doe"  THEN CONCAT('c',name) 
    ELSE name 
END 
संबंधित मुद्दे