2009-06-02 14 views
22

मेरा उद्देश्य है: एक मूल्य सूची से कई पंक्तियां प्राप्त करने के लिए, (1,2,3,4,5), ('ए', 'बी', 'सी', 'कुछ भी') और शीघ्र।mysql नकली चयन

mysql> select id from accounts where id in (1,2,3,4,5,6); 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 5 | 
| 6 | 
+----+ 
5 rows in set (0.00 sec) 

ऊपर एसक्यूएल निश्चित रूप से ठीक है, लेकिन मेरे सवाल यह है: वहाँ एक रास्ता बिना

एक मेज को निर्दिष्ट एक ही परिणाम प्राप्त करने के लिए है क्योंकि यहाँ मेरा उद्देश्य एक id_set

द्वारा पंक्तियों का प्रचार करने के लिए बस है?

एक और उदाहरण:

mysql> select now() as column1; 
+---------------------+ 
| column1    | 
+---------------------+ 
| 2009-06-01 20:59:33 | 
+---------------------+ 
1 row in set (0.00 sec) 

mysql> 

यह उदाहरण एक तालिका निर्दिष्ट किए बिना एक ही पंक्ति परिणाम प्रचारित

लेकिन स्ट्रिंग से कई पंक्तियां कैसे प्रसारित करें (1,2,3,4,5,6)?

+0

क्या पंक्तियां? पंक्तियों में एक पंक्ति में मौजूद है। मेज के बिना कोई पंक्ति नहीं है। – jmucchiello

+0

मैंने अपना प्रश्न अपडेट कर लिया है, उम्मीद है कि इस बार इसे स्पष्ट किया गया है :) – omg

उत्तर

22

कुछ इस तरह काम करना चाहिए:

SELECT * 
FROM (
    SELECT 0 as id 
    UNION SELECT 1 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    UNION SELECT 5 
) 
+1

यह काफी ढीला लगता है, क्या इस प्रश्न को लिखने का एक और अधिक कॉम्पैक्ट तरीका है? – omg

+0

क्यों चुनें *? अकेले आंतरिक प्रश्न को अच्छी तरह से काम करना चाहिए। –

+0

एलेक्स मार्टेलि जैसी एक पूर्णांक तालिका का उपयोग करने से कम सुझाव देता है, यह कॉम्पैक्ट जैसा है क्योंकि आप एक ही प्रश्न में प्राप्त कर सकते हैं। आप एक temp तालिका बना सकते हैं और INSERT का उपयोग कर सकते हैं ... मूल्य ((1), (2), (3), (4), (5) (6)) या ऐसा कुछ, फिर उस temp तालिका से चुनें। यह थोड़ा और कॉम्पैक्ट दिखता है, लेकिन कार्यात्मक रूप से, अधिक ओवरहेड है। – eksortso

6

MySQL एक डमी टेबल है: दोहरी। लेकिन डीयूएएल का उपयोग कुछ भी नहीं बदलता है (यह सिर्फ सुविधा के लिए है), और निश्चित रूप से यह क्वेरी काम नहीं करता है।

मुझे यकीन है कि आप जो करने की कोशिश कर रहे हैं उसे हासिल करने का एक बेहतर तरीका है। यदि आप अपनी समस्या की व्याख्या करते हैं तो हम आपकी सहायता कर सकते हैं।

+1

धन्यवाद! मुझे एक खंड के साथ निरंतर मूल्यों का चयन करने के लिए डुएल की आवश्यकता थी। यह वैकल्पिक रूप से स्थिरांक डालने के लिए एक हैक है। – Jay

1

यही आपके प्रश्न का उत्तर नहीं है, लेकिन मेरा मानना ​​है कि यह अपने वास्तविक समस्या को ठीक होगा ..

सेट @counter = 0; चुनें (@counter: = @counter +1 काउंटर के रूप में) ... आपकी शेष क्वेरी

+0

मेरा डेमो पूर्णांक का उपयोग कर रहा है, लेकिन यह केवल पूर्णांक तक सीमित नहीं है, जैसे स्ट्रिंग सूची भी हो सकती है ('ए', 'बी', 'कुछ भी') – omg

+0

मुझे लगता है कि एक अस्थायी तालिका का उपयोग करें =) – Evert

+0

तब यह अस्थायी तालिका हो सकती है एक बड़ा होने के लिए जमा करें, मुझे डर है – omg

0

एक तकनीक मैं अमूल्य पाया है an "integers table" जिसे आप आसानी से इसे मिलाकर साफ हर प्रकार की चीजें करने की सुविधा देता है, (xaprb इस तकनीक पर कई ब्लॉग पोस्ट और निकट से संबंधित "म्यूटेक्स टेबल" लिखा है)।

+0

मुझे नहीं लगता कि यह स्थिर है क्योंकि हमें प्रत्येक बार उपयोग करने के बाद तालिका को साफ़ करने की आवश्यकता है, जो आसानी से गलती का कारण बन सकता है। – omg

+0

@Shore, आपको प्रत्येक उपयोग के बाद अपनी पूर्णांक तालिका को साफ़ करने की आवश्यकता क्यों है? यदि संभव हो, तो आप तालिका को स्थायी बना सकते हैं और आवश्यकतानुसार इसका चयन कर सकते हैं। – eksortso

+0

ऐसा लगता है कि पंक्तियों से बाहर पंक्तियों को प्रसारित करने का एकमात्र तरीका है, कहें, एक टेबल के साथ होना चाहिए .. – omg

0

एक साधारण और पुराने तरीके से एक सारणी का उपयोग करना है जिसमें लगातार मूल्य हैं।

DROP TABLE IF EXISTS `range10`; 
CREATE TABLE IF NOT EXISTS `range10` (
    `id` int(11) NOT NULL, 
    KEY `id` (`id`) 
) ENGINE=MyISAM; 
INSERT INTO `range10` (`id`) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 

एक बार इंस्टॉल हो जाने पर आप नीचे दिखाए गए प्रश्न लिख सकते हैं।

हर दूसरी पंक्ति मिलती है:

select * from your_data_table where id in (
SELECT id*2 as id FROM `range10` WHERE id in(
    select id from `range10` 
) 
) 

प्राप्त 1101 से 1111 के लिए पंक्तियों:

select * from your_data_table where id in (
SELECT id+1100 as id FROM `range10` WHERE id in(
    select id from `range10` 
) 
) 

तो अगर आप अधिक से अधिक पर्वतमाला की जरूरत होती हैं, तो बस आकार में वृद्धि तालिका सीमा 10 में लगातार मूल्यों का। क्वेरीिंग सरल है, लागत कम है, कोई संग्रहित प्रक्रिया या फ़ंक्शन आवश्यक नहीं है।

नोट:

आप लगातार चार मूल्यों के साथ एक मेज, भी बना सकते हैं। लेकिन सामग्री को बदलना इतना आसान नहीं होगा।

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