2012-10-04 20 views
11

Es posible obtener un valor aleatorio del grupo por?Agrupar por valor RAND()

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

Con este SQL:

SELECT nID, VAL FROM T1 GROUP BY nID 

Mi resultado siempre es:

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

pero quiero resultado de diferent evey nID. Al igual que:

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

o

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

Es posible?

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

+2

Pruébalo y mira. ¿Que es esto? "¡Sorpréndete! ¡Devuelve lo que quieras!" ¿Cómo encaja esto en una API? – duffymo

+0

Estaría en mejor posición para aprender a utilizar SQL estandarizado en lugar de la espantosa implementación de MySQL del grupo por – podiluska

Respuesta

2

Utilice una sub-consulta.

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

Puede utilizar el orden de rand() entonces grupo por ellos.

Como

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 subconsulta es una relación, y las relaciones en SQL no tienen ninguna relación inherente orden. En ese sentido, la línea 'ORDER BY' en su consulta no tiene un significado bien definido, y las versiones futuras de MySQL podrían simplemente ignorar esa línea, sin violar ninguna garantía que yo sepa. Entonces, aunque esto funcione * ahora *, no hay garantía de que esto funcione en el futuro. – MvG

+0

¿Puedes explicarlo un poco más? ¿Debería hacerse de otra manera (¿existe?) Si las versiones superiores de MySQL van a ignorar la cláusula 'ORDER BY'? – Sanuj

0

Trate Esta

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

El [comentario] (http: // stackoverflow.com/questions/12725363/group-by-value-rand/12725537 # comment17186874_12725537) Escribí a Sanuj que la respuesta también se aplica a la suya. – MvG

0

La siguiente solución es similar en espíritu a los de xdazz o jonnyynnoj. Pero en lugar de SELECT FROM T1 GROUP BY nID uso una subconsulta para seleccionar todas las identificaciones distintas. Creo que existe la posibilidad de que el rendimiento sea diferente, así que pruebe este.

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