1,700
पंक्तियों की आपकी वर्तमान तालिका के लिए आपका समाधान ठीक है।
यदि आपको पंक्तियों के 100,000
पसंद आएंगे, तो DISTINCT
अक्षम हो सकता है।
यह समाधान name
पर एक सूचकांक को रोजगार:
यहाँ अपने ब्लॉग में लेख से पता चलता है कि कैसे कुशलतापूर्वक यह करने के लिए है। यह इंडेक्स कुंजी पर कूद जाएगा, प्रत्येक बार सबसे पहले अक्षर का चयन करेगा।
सबसे पहले, आप एक समारोह बनाने की आवश्यकता होगी:
CREATE FUNCTION fn_get_next_code(initial INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _next VARCHAR(200);
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
SELECT ORD(SUBSTRING(name, 1, 1))
INTO _next
FROM t_names
WHERE name >= CHAR(initial + 1)
ORDER BY
name
LIMIT 1;
RETURN _next;
END
इस समारोह, एक शुरू करने पत्र की एक कोड दिया, पहले प्रारंभिक पत्र अपनी मेज से दिया करने के लिए अगले देता है।
दूसरा, एक प्रश्न में इस समारोह का उपयोग करें: प्रत्येक यात्रा पर
SELECT CHAR(@r) AS starting,
@r := fn_get_next_letter(@r) AS next
FROM (
SELECT @r := ORD(LEFT(MIN(name), 1))
) vars, mytable
WHERE @r IS NOT NULL
, सत्र चर @r
एक सूचकांक का उपयोग कर अगले प्रारंभिक पत्र के लिए छोड़ देगा।
यह बहुत तेज़ होगा, लेकिन यह केवल तभी भुगतान करता है जब आपके पास सैकड़ों हजार पंक्तियां हों।
अन्यथा बस DISTINCT
का उपयोग करें।
आपकी तालिका में आपके कितने रिकॉर्ड हैं?मैं एक अनुकूलित संस्करण पोस्ट करना चाहता था लेकिन मुझे नहीं पता कि परेशान करना है :) – Quassnoi
ठीक है, मैंने इसे पोस्ट किया है :) शायद कल मैं अपने ब्लॉग में आपके प्रश्न से एक पोस्ट कर दूंगा। – Quassnoi