2012-10-04 16 views
11

È possibile ottenere un valore casuale del gruppo per?Raggruppa per valore RAND()

---------------- 
nID | val 
--------------- 
    A | XXX 
    A | YYY 
    B | L 
    B | M 
    B | N 
    B | P 
---------------- 

Con questo SQL:

SELECT nID, VAL FROM T1 GROUP BY nID 

Il mio risultato è sempre:

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

ma voglio un risultato differenti di Evey nID. Come:

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

o

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

E 'possibile?

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

+2

Provalo e guarda. Cos'è questo? "Sorprendimi, rimanda quello che vuoi!" Come si inserisce questo in un'API? – duffymo

+0

Sarai in una posizione migliore per imparare a utilizzare SQL standardizzato piuttosto che l'implementazione di gruppo di MySQL da – podiluska

risposta

2

Utilizzare un sub-query.

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

È possibile utilizzare ordine da rand() poi di gruppo da loro.

Come

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

http://sqlfiddle.com/#!2/357b8/32 – Sanuj

+0

Una sottoquery è una relazione e le relazioni in SQL non hanno ordine. In questo senso, la riga 'ORDER BY' nella tua query non ha un significato ben definito e le future versioni di MySQL potrebbero semplicemente ignorare quella linea, senza violare alcuna garanzia che io conosca. Quindi anche se questo funziona * ora *, non è garantito che funzioni ancora in futuro. – MvG

+0

Puoi spiegarlo un po 'di più ?? Dovrebbe essere fatto in modo diverso (c'è?) Se versioni più alte di MySQL ignorassero la clausola 'ORDER BY'? – Sanuj

0

Try This

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

Il [commento] (http: // stackoverflow.it/questions/12725363/group-by-value-rand/12725537 # comment17186874_12725537) Ho scritto alla risposta di Sanuj anche per il tuo. – MvG

0

La seguente soluzione è simile nello spirito a quelli da xdazz o jonnyynnoj. Ma invece di SELECT FROM T1 GROUP BY nID io uso una subquery per selezionare tutti gli ID distinti. Credo che ci sia una possibilità che le prestazioni possano differire, quindi diamo anche a questo una prova.

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