Günther S: GROUP BY... ORDER BY RAND()

Hallo,

ich habe eine Tabelle mit "klassierten" Datensätzen, d.h. jeder Datensatz hat bspw. Klasse A oder Klasse B (Spalte 'klasse'). Nun möchte ich aus jeder Klasse zufällig einen Datensatz auslesen.

[code=sql]
SELECT * FROM table GROUP BY klasse ORDER BY RAND() LIMIT 2
[/code]
liefert nicht das gewünschte Ergebnis.
Ich möchte, dass die einzelnen Klassen sortiert werden, nicht die 2 Datensätze, die durch GROUP BY entstehen. Wie ist das (am besten in einer Abfrage) möglich?

Gruß,
Günther

  1. Hallo

    ich habe eine Tabelle mit "klassierten" Datensätzen, d.h. jeder Datensatz hat bspw. Klasse A oder Klasse B (Spalte 'klasse'). Nun möchte ich aus jeder Klasse zufällig einen Datensatz auslesen.

    SELECT * FROM table GROUP BY klasse ORDER BY RAND() LIMIT 2

    
    > liefert nicht das gewünschte Ergebnis.  
      
    das war auch von dieser Abfrage, die jedes DBMS außer MySQL als syntaktisch  
    falsch zurückweist, nicht zu erwarten. Immerhin bekommst Du unvorhersagbare  
    Ergebnisse - reicht Dir das noch nicht ;-)  
      
    
    > Ich möchte, dass die einzelnen Klassen sortiert werden, nicht die 2 Datensätze, die durch GROUP BY entstehen. Wie ist das (am besten in einer Abfrage) möglich?  
      
    Mit [UNION](http://dev.mysql.com/doc/refman/5.0/en/union.html):  
      
    <zitat>  
        To apply ORDER BY or LIMIT to an individual SELECT, place the clause  
        inside the parentheses that enclose the SELECT:  
      
        (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)  
        UNION  
        (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);  
    </zitat>  
      
    Ausgehend von diesem Handbuchbeispiel solltest Du Dein Problem leicht lösen können.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hallo,

      Mit UNION:

      <zitat>
          To apply ORDER BY or LIMIT to an individual SELECT, place the clause
          inside the parentheses that enclose the SELECT:

      (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
          UNION
          (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
      </zitat>

      Ausgehend von diesem Handbuchbeispiel solltest Du Dein Problem leicht lösen können.

      Allerdings, ich danke.

      Gruß,
      Günther

      1. Hallo,

        Mit UNION:

        <zitat>
            To apply ORDER BY or LIMIT to an individual SELECT, place the clause
            inside the parentheses that enclose the SELECT:

        (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
            UNION
            (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
        </zitat>

        Ausgehend von diesem Handbuchbeispiel solltest Du Dein Problem leicht lösen können.

        Aeh, wo bleibt der Zufall dabei?
        Oder steh ich auf dem Schlauch?

        Gruß
        Reiner