Ankündigung

Einklappen
Keine Ankündigung bisher.

ORDER BY RAND() oder rand()

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ORDER BY RAND() oder rand()

    Hey.

    Um zufällige Datensätze auszugeben habe ich bisher immer die Funtion ORDER BY RAND() in mysql genutz.

    Habe aber im Netz gelesen da diese bei höhren Datenanzahlen viel Kapazität frist und es so besser wäre.

    1. mit COUNT Anzahl der Datensätze ermitteln
    2. $var = rand(1,anzahl der Datensätze)
    3. Abfrage mit LIMIT $var,1

    Ich würde aber gern 5 oder 10 durch Zufall ausgeben nur erhalte ich öfters doppelte.

    Meine Frage ist nun wie schaffe ich es das es wirklich immer unterschiedliche Datensätze sind?

    Lg Stephie

  • #2
    Wenn du nicht wirklich Performance-Probleme hast, solltest du bei ORDER BY RAND() bleiben. Da kannst du ja auch mit LIMIT arbeiten und die gewünschte Anzahl Sätze mit einer Abfrage holen.

    Im andern Fall musst du selber dafür sorgen, dass du keine doppelten Einträge erhälst, indem du z.B. halt solange Zufallszahlen in einen Array schreibst, bis du die nötige Anzahl eindeutiger Zahlen beisammen hast. Dann musst du aber die Daten einzeln abfragen, was letztendlich zu (Anzahl der Datensätze + 1) Abfragen führt. Ob das effizienter ist, wage ich zu bezweifeln.

    Kommentar


    • #3
      Wieso bei ORDER BY RAND() bleiben

      siehe

      Warum man nicht “ORDER BY RAND()” benutzen soll | dasnov.de

      EDIT:

      sowas hier nutzen?

      PHP-Code:
          $zahlen = array();
          for(
      $i=0$i<7$i++) {
              
      $temp mt_rand(1,49);
              if( 
      in_array($temp$zahlen) ) {
                  
      $i--;
                  continue;
              }
              
      $zahlen[] = $temp;
          } 

      Kommentar


      • #4
        Der von dir genannte Link überzeugt nur dann, wenn es um einzelne zufällige Sätze geht.
        In deinem Fall bleibe ich aber bei meiner Aussage.
        Aber wenn du es trotzdem anders haben willst, kannst du das auch noch vereinfachen:
        PHP-Code:
        $zahlen = array();
        do {
            
        $zahlen[] = mt_rand(149);
            
        $zahlen array_unique($zahlen);
        } while(
        count($zahlen 7); 

        Kommentar


        • #5
          Zitat von lazydog Beitrag anzeigen
          Wenn du nicht wirklich Paeerformance-Probleme hast, solltest du bei ORDER BY RAND() bleiben. Da kannst du ja auch mit LIMIT arbeiten und die gewünschte Anzahl Sätze mit einer Abfrage holen.

          Im andern Fall musst du selber dafür sorgen, dass du keine doppelten Einträge erhälst, indem du z.B. halt solange Zufallszahlen in einen Array schreibst, bis du die nötige Anzahl eindeutiger Zahlen beisammen hast. Dann musst du aber die Daten einzeln abfragen, was letztendlich zu (Anzahl der Datensätze + 1) Abfragen führt. Ob das effizienter ist, wage ich zu bezweifeln.
          ich versteh dennoch net warum es bei einzeln datensätze schlecht ist aber wen nich mehre durchzufall ausgeben will nehmen soll...

          Kommentar


          • #6
            Zitat von lazydog Beitrag anzeigen
            ...Da kannst du ja auch mit LIMIT arbeiten und die gewünschte Anzahl Sätze mit einer Abfrage holen...
            ...was letztendlich zu (Anzahl der Datensätze + 1) Abfragen führt...

            Kommentar


            • #7
              warum es bei einzeln datensätze schlecht ist aber wen nich mehre durchzufall ausgeben will nehmen soll...
              Und ich verstehe - wiedereinmal - Deine Sätze nicht.

              Kommentar


              • #8
                Also ich hab das jetzt so
                PHP-Code:
                        $sql "SELECT DISTINCT s_unterkategorien.id,s_termine.rid,s_termine.termin_beg,
                                s_unterkategorien.bild,s_unterkategorien.rlink,s_unterkategorien.name,s_unterkategorien.id 
                                FROM s_unterkategorien 
                                LEFT JOIN s_termine ON s_termine.rid = s_unterkategorien.artikelnummer
                                LEFT JOIN s_reise_typen ON s_reise_typen.rid = s_unterkategorien.artikelnummer
                                WHERE 
                $abfrage s_unterkategorien.bild = 'ok'
                                AND (s_termine.termin_beg > '
                $var' OR s_termine.termin_beg = '0') 
                                GROUP BY s_termine.rid 
                                ORDER BY RAND() LIMIT 5"

                Hab das in einer Fruntion stehen die ich dann auf der entsprechenden Seite aufrufe.

                Wenn ich diese aber an 2 Stellen auf der Seite aufrufe habe ich eben das Problem mit den doppelten Datensätze.

                Dies würde ich gern verhindern.

                Kommentar


                • #9
                  Wenn du die Abfrage zwei mal aufrufst, kannst du natürlich doppelte Daten bekommen. Dafür erhälst du mit diesem GROUP BY auch innerhalb des Satzes Zufallsresultate ...

                  Kommentar


                  • #10
                    Zitat von lazydog Beitrag anzeigen
                    Wenn du die Abfrage zwei mal aufrufst, kannst du natürlich doppelte Daten bekommen. Dafür erhälst du mit diesem GROUP BY auch innerhalb des Satzes Zufallsresultate ...
                    Also das GROUP BY weglassen, wenn ich da richtig verstanden habe?

                    NEE ähm das GROUP BY muss ja drin bleiben, weil der Tabelle Termine ja die id mehrfach ist, also mehrere termine zu einer Unterkategorie vorhanden sind

                    Kommentar


                    • #11
                      Dann wirst du einfach zufällige (bzw. normalerweise die ersterfasseten) Unterkategorien erhalten.
                      Grundsätzlich gilt: Bei einer Abfrage mit GROUP BY müssen all Attribute, die selektiert werden sollen, auch in der GROUP BY-Klausel stehen. Bei den meisten RDBMS (aber eben nicht bei MySQL) führt deine Abfrage zu einem Fehler.

                      Kommentar


                      • #12
                        mh aber zeigt kein fehler an oder wie meintest du das jetzt?

                        Kommentar


                        • #13
                          Zitat von scheffie Beitrag anzeigen
                          mh aber zeigt kein fehler an oder wie meintest du das jetzt?
                          Nein, weil MySQL das dummerweise akzeptiert (auch wenn es wenige Situationen gibt, in denen das Sinn macht), dafür dir halt dann irgendwelche Daten liefert. Woher soll die DB auch wissen, welche Unterkategorie du genau für einen bestimmten Termin haben willst.

                          Kommentar


                          • #14
                            Es geht nur darum das es nur datensätze anzeigen soll wo es noch gültige termine sind. deswegen sind die ja auch mit einandere verknüpft

                            ansonsten weiß ich ne was du meint

                            Kommentar


                            • #15
                              Zitat von scheffie Beitrag anzeigen
                              Es geht nur darum das es nur datensätze anzeigen soll wo es noch gültige termine sind.
                              Und ich sage nur, dass du das mit deiner Abfrage nicht erreichen willst. Da ich aber weder dein DB-Design kenne, noch genau verstehe, was du willst (die miserable Rechtschreibung buche ich jetzt mal unter "vermutlich nicht deutsche Muttersprache" ab), ist es schwierig dir zu helfen.

                              Kommentar

                              Lädt...
                              X