2009-05-13 11 views
61

से प्रत्येक एन-वें पंक्ति का चयन कैसे करते हैं मेरे पास डेटाबेस में मानों की एक श्रृंखला है जिसे मुझे लाइन चार्ट बनाने के लिए खींचने की आवश्यकता है। क्योंकि मुझे उच्च रिज़ॉल्यूशन की आवश्यकता नहीं है क्योंकि मैं डेटाबेस से प्रत्येक 5 वीं पंक्ति का चयन करके डेटा को दोहराना चाहता हूं।आप mysql

उत्तर

63
SELECT * 
FROM ( 
    SELECT 
     @row := @row +1 AS rownum, [column name] 
    FROM ( 
     SELECT @row :=0) r, [table name] 
    ) ranked 
WHERE rownum % [n] = 1 
+0

क्या कोई इस काम के बारे में अधिक जानकारी प्रदान कर सकता है? उदाहरण के लिए प्रश्न ने प्रत्येक 5 वीं पंक्ति के लिए पूछा और उत्तर में 5 का कोई उल्लेख नहीं है। – Crazometer

+2

@ क्राज़ोमीटर प्रत्येक 5 वीं पंक्ति प्राप्त करने के लिए 5 के साथ क्वेरी में '[n] 'को प्रतिस्थापित करता है। –

+0

इस पर विस्तार करने के लिए, यदि आप पहली पंक्ति से शुरू नहीं करना चाहते थे लेकिन दूसरा उदाहरण के लिए? – HPWD

43

आप जहां आईडी 5. के कई है mod 5 पंक्तियाँ प्राप्त करने की कोशिश कर सकता है (यह मानते हुए आप आईडी स्तंभ अनुक्रमिक है किसी प्रकार का होता है।)

select * from table where table.id mod 5 = 0; 
+12

यह भी मानते हुए कि आपके पास डिलीट या रोलबैक के कारण अनुक्रम में कोई अंतराल नहीं है। –

+2

यह अधिकांश भाग के लिए काम करेगा लेकिन हटाए गए पंक्तियों के लिए खाता नहीं है। –

+1

कुछ परीक्षण के लिए सरल और शानदार :-) –

20

जब से तुम ने कहा कि आप MySQL का उपयोग कर रहे हैं, तो आप निरंतर पंक्ति संख्या बनाने के लिए user variables का उपयोग कर सकते हैं। आपको इसे व्युत्पन्न तालिका (सबक्वायरी) में रखना होगा हालांकि।

SET @x := 0; 
SELECT * 
FROM (SELECT (@x:[email protected]+1) AS x, mt.* FROM mytable mt ORDER BY RAND()) t 
WHERE x MOD 5 = 0; 

मैं बजाय नमूने में हर बार होने के लिए बिना क्रम वाली तालिका के हर पांचवें पंक्ति की अनुमति के ORDER BY RAND() जोड़ा एक कूट-यादृच्छिक नमूने प्राप्त करने के लिए,।


एक अनाम उपयोगकर्ता इस x MOD 5 = 1 को x MOD 5 = 0 बदलने के लिए संपादित करने के लिए करने की कोशिश की। मैंने इसे वापस अपने मूल में बदल दिया है।

रिकॉर्ड के लिए, कोई उस स्थिति में 0 और 4 के बीच किसी भी मान का उपयोग कर सकता है, और किसी अन्य पर एक मूल्य को प्राथमिकता देने का कोई कारण नहीं है।

+0

मैं इसका जवाब अपडेट कर रहा था, और आपने मुझे इसे हराया! अच्छी सोच। दुर्भाग्यवश –

+0

दुर्भाग्यवश, यह कई प्रविष्टियों के साथ काम करते समय कम से कम x100 द्वारा निष्पादन को धीमा कर देता है – Blauhirn

2

मैं ऐसा कुछ ढूंढ रहा था। टेलर और विधेयक के जवाब ने मुझे अपने विचारों में सुधार करने के लिए प्रेरित किया।

तालिका data1 क्षेत्रों read_date है, मूल्य हम एक प्रश्न एक read_date रेंज ली गई तालिका के नाम डीटी

क्वेरी कहा जाता है मनमाना है और यहां के द्वारा ही सीमित से हर 2 डी रिकॉर्ड का चयन करना चाहते:

SET @row := 0; 
    SELECT * FROM (SELECT @row := @row +1 AS rownum, read_date, value FROM data1 
    WHERE read_date>= 1279771200 AND read_date <= 1281844740) as DT WHERE MOD(rownum,2)=0 
+0

धन्यवाद, मैं इसकी तलाश में था। मुझे किसी भी तरह से जांच करने की आवश्यकता है कि संग्रहीत प्रक्रियाओं के लिए लॉग तालिका में एक निश्चित कॉलम हर दूसरी बार समान मूल्य था। 'Proc start' की तरह, 'proc ending'। नीचे दिया गया एसक्यूएल 1 के साथ परिणाम देगा यदि सबकुछ ठीक है। 'सेट @row: = 0; चयन करें (विशिष्ट संदेश) से ( SELECT @row: = @row +1 एएस राउनम, संदेश संचालन से।EventLog जहां लॉगटाइम> अब() - अंतराल 6 घंटे और प्रक्रिया नाम = 'Do_CDR' ) डीटी जहां एमओडी (राउनम, 2) = 0; ' – eigil

6
SET @a = 0; 
SELECT * FROM t where (@a := @a + 1) % 2 = 0; 
0
$Query = "SELECT * 
      FROM ( 
       SELECT @row := @row +1 AS rownum, posts.* 
       FROM (
         SELECT @row :=0) r, posts 
        ) ranked 
       WHERE rownum %3 =1"; 

जहां पदों मेरी मेज है: