2012-10-04 38 views
11

क्या संभव है समूह के यादृच्छिक मूल्य को प्राप्त करें?समूह मूल्य द्वारा रैंड()

---------------- 
nID | val 
--------------- 
    A | XXX 
    A | YYY 
    B | L 
    B | M 
    B | N 
    B | P 
---------------- 
इस एसक्यूएल के साथ

:

SELECT nID, VAL FROM T1 GROUP BY nID 

मेरे परिणाम हमेशा होता है:

nID val 
-------- 
A XXX 
B L 

लेकिन मैं evey एनआईडी के विभिन्न परिणाम चाहते हैं। जैसा:

nID val 
-------- 
A YYY 
B N 

या

nID val 
-------- 
A XXX 
B P 

यह संभव है?

http://sqlfiddle.com/#!2/357b8/3

+2

इसे आज़माएं और देखें। यह क्या है? "मुझे आश्चर्यचकित करो! जो भी आप चाहते हैं उसे वापस भेजें!" यह एक एपीआई में कैसे फिट है? – duffymo

+0

आप – podiluska

उत्तर

2

एक उप क्वेरी का उपयोग करें।

SELECT r.nID, 
(SELECT r1.val FROM T1 r1 WHERE r.nID=r1.nID ORDER BY rand() LIMIT 1) AS 'val' FROM T1 r 
GROUP BY r.nID 

http://sqlfiddle.com/#!2/357b8/18

1
SELECT 
    t1.nID, 
    (SELECT 
    t2.var 
    FROM your_table t2 
    WHERE t1.nID = t2.nID ORDER BY rand() LIMIT 1 
) AS var 
FROM your_table t1 
GROUP BY t1.nID ; 
3

आप रैंड द्वारा आदेश का उपयोग कर सकते() तो उनके द्वारा समूह।

तरह

SELECT nID, VAL FROM (
    SELECT nID, VAL 
    FROM T1 
    ORDER BY RAND() 
)AS subquery 
GROUP BY nID 
+0

द्वारा समूह के MySQL के अपरिवर्तनीय कार्यान्वयन के बजाय मानकीकृत एसक्यूएल का उपयोग करना सीखना बेहतर होगा http://sqlfiddle.com/#!2/357b8/32 – Sanuj

+0

एक सबक्वायरी एक संबंध है, और एसक्यूएल में संबंधों में कोई अंतर्निहित नहीं है आदेश। उस अर्थ में, आपकी क्वेरी में 'ORDER BY' लाइन का कोई अच्छी तरह से परिभाषित अर्थ नहीं है, और MySQL के भविष्य के संस्करण केवल उस पंक्ति को अनदेखा कर सकते हैं, बिना किसी गारंटी के उल्लंघन किए। तो यह काम करता है * अब *, इस बात की कोई गारंटी नहीं है कि यह अभी भी भविष्य में काम करेगा। – MvG

+0

क्या आप इसे थोड़ा और समझा सकते हैं ?? क्या इसे अलग-अलग तरीके से किया जाना चाहिए (क्या वहां है?) यदि MySQL के उच्च संस्करण 'ORDER BY' खंड को अनदेखा करने जा रहे हैं? – Sanuj

0

प्रयास करें यह

SELECT nID, VAL 
FROM (select nID, VAL from T1 order by rand()) as T 
group by nID 
+0

[टिप्पणी] (http: // stackoverflow।कॉम/प्रश्न/12725363/समूह-दर-मूल्य-रैंड/12725537 # टिप्पणी 17186874_12725537) मैंने लिखा है कि संजु का उत्तर भी आपके लिए लागू होता है। – MvG

0

निम्नलिखित समाधान xdazz या jonnyynnoj से उन लोगों के लिए भावना में समान है। लेकिन SELECT FROM T1 GROUP BY nID के बजाय मैं सभी विशिष्ट आईडी चुनने के लिए एक सबक्वायरी का उपयोग करता हूं। मेरा मानना ​​है कि एक मौका है कि प्रदर्शन भिन्न हो सकता है, इसलिए इसे भी एक कोशिश करें।

SELECT nID, 
    (SELECT VAL 
    FROM T1 
    WHERE T1.nID = ids.nID 
    ORDER BY RAND() 
    LIMIT 1 
) AS VAL 
FROM (SELECT DISTINCT nID FROM T1) AS ids 
संबंधित मुद्दे