2012-10-04 17 views
11

Es ist möglich, einen zufälligen Wert der Gruppe zu erhalten?Gruppe Nach Wert RAND()

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

Mit diesem SQL:

SELECT nID, VAL FROM T1 GROUP BY nID 

Mein Ergebnis ist immer:

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

aber ich möchte ein diferent Ergebnis evey nID. Wie:

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

oder

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

Es ist möglich?

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

+2

Versuchen Sie es und sehen. Was ist das? "Überrasche mich! Schick zurück, was immer du willst!" Wie passt das in eine API? – duffymo

+0

Sie wären besser in der Lage, standardisiertes SQL anstelle der erschreckenden MySQL-Implementierung der Gruppe zu verwenden. – podiluska

Antwort

2

eine Unterabfrage verwenden.

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

Sie bestellen von rand() verwenden dann Gruppe von ihnen.

Wie

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

Eine Unterabfrage ist eine Relation, und Relationen in SQL haben keine inhärente Auftrag. In diesem Sinne hat die Zeile "ORDER BY" in Ihrer Anfrage keine wohldefinierte Bedeutung, und zukünftige Versionen von MySQL ignorieren diese Zeile einfach, ohne gegen die mir bekannten Garantien zu verstoßen. Auch wenn dies jetzt * funktioniert, gibt es keine Garantie, dass dies auch in Zukunft funktioniert. – MvG

+0

Kannst du es bitte etwas genauer erklären ?? Sollte es anders gemacht werden (gibt es?), Wenn höhere Versionen von MySQL die 'ORDER BY'-Klausel ignorieren? – Sanuj

0

Try This

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

Der [Kommentar] (http: // stackoverflow.com/questions/12725363/group-by-value-rand/12725537 # comment17186874_12725537) Ich schrieb an Sanuj's Antwort gilt auch für deins. – MvG

0

Die folgende Lösung im Geiste jene von xdazz oder jonnyynnoj ähnlich ist. Aber statt SELECT FROM T1 GROUP BY nID benutze ich eine Unterabfrage, um alle eindeutigen IDs auszuwählen. Ich glaube, es besteht die Möglichkeit, dass die Leistung unterschiedlich ist, also versuchen Sie es auch.

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