Ankündigung

Einklappen
Keine Ankündigung bisher.

order by rand()

Einklappen

Neue Werbung 2019

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

  • order by rand()

    Hallo zusammen,

    ich habe folgendes kleines Problem. Ich lese eine Tabelle mit order by rand() aus. soweit so gut. durch eine Blätterfunktion wird die Ausgabe jedoch auch mit jedem weiter blättern neu sortiert.

    Mein Ziel ist es, ein mal zu mischen mit rand() und diese Mischung für diese Sitzung (session) beizubehalten. (auch beim blättern.) damit durch das blättern nicht zufällig datensätze ausgelassen oder Doppelt angezeigt werden.

    Hat da jemand eine Idee wie ich das anstellen kann?

    beispiel wie ich es zur Zeit habe:
    PHP-Code:
            
    $sql 
    "SELECT * FROM tabelle ORDER BY rand()";
    $query sprintf("%s LIMIT %d, %d"$sql$sr$mr);
    $res mysql_query($query$con) or die(mysql_error());
    $row mysql_fetch_assoc($res); 
    live zusehen hier:
    http://www.24tourist.at/index.php?s=...mer&l=de&rem=0
    Gruß JEGO ;-)

    Ein PHP Script tut, was Du schreibst, nicht was Du willst.

  • #2
    Wird so net klappen, da die Session eine PHP-Funktion ist und mit MySQL in der Form nicht kombinierbar. Was möglich sein müsste ist, dass du einmal komplett ausliest ("durchmischt"), was du ja eh machst (ist zum Blättern eigentlich ungünstig...) und dann die zurück gegebene Ressource in die Session packst.
    Nicht jeder Fehler ist ein Bug.

    Kommentar


    • #3
      @KingCrunch

      danke für die Antwort.

      Ich hab mir schon überlegt, ob ich mir ein Cron einrichte der alles einmal mischt, und das von mir aus jede stunde. jedoch find ich das mit jedem Seitenaufruf besser.

      Also wenn ich dich richtig verstehe, erste mysql Abfrage Mischt.
      die zweite nimmt das Ergebnis und gibt anhand der obigen mischung aus.
      Jedoch steh ich da vor einem Rätzel, wie übergebe ich das am sinvollsten?

      Wie würdest du das machen?

      Edit

      jetzt versteh ich erst was du meinst. jedoch überlege dir wieviel ich da in die Session schreiben müste bei später mal um die 1000 Einträgen und 97 Spalten in der Tabelle.

      ich dachte eher daran das ich mir nur die gemischten ID´s in die session schreibe und an hand dieser dann ausgebe. jedoch scheiter ich an der Übergabe der ID´s in der Session an die mysql abfrage.

      greets JEGO
      Gruß JEGO ;-)

      Ein PHP Script tut, was Du schreibst, nicht was Du willst.

      Kommentar


      • #4
        Das ginge sicher auch, wird aber algorithmisch aufwendiger, weil du
        a) erstmal die ids in der von dir gewollten Reihenfolge abfragen musst und
        b) später jede id wieder einzeln aus der db auslesen musst.

        Das Problem ist, dass du die neue Sortierung nicht so einfach an deine Tabelle binden kannst. Eine Möglichkeit wäre es allerdings auch (kommt mir grad in den Sinn), dass du eine neue Spalte "sort" oder sowas einrichtest, in der du (numerisch) die Position in der gemischten Sortierung schreibst. Bei der nächsten Abfrage könntest du dann einfach die Sortierung per ORDER BY sort wiederherstellen. Dies wäre dann allerdings benutzerübergreifend (also alle Benutzer bekommen die selbe, wenn auch durchmischte Reihenfolge) und ich weiß nicht, ob das so von dir gedacht war ^^
        Nicht jeder Fehler ist ein Bug.

        Kommentar


        • #5
          hmmm... das ist ne gute Idee.

          ich schau mir das mal an. Danke :wink:
          Gruß JEGO ;-)

          Ein PHP Script tut, was Du schreibst, nicht was Du willst.

          Kommentar


          • #6
            Zitat von KingCrunch
            dass du eine neue Spalte "sort" oder sowas einrichtest, in der du (numerisch) die Position in der gemischten Sortierung schreibst.
            den gedanken kann man ja weiterführen und statt einer spalte eine zusätzliche tabelle "bla_sorting (user_id, object_id, sort)" hernehmen, womit man dann per
            Code:
            LEFT JOIN bla_sorting ON (bla_sorting.object_id = xyz.id AND user_id=?) ORDER BY bla_sorting.sort ASC
            das ganze relativ effizient mehrbenutzerfähig gestaltet

            Kommentar


            • #7
              @axo danke für den Tipp schau ich mir auch mal an.

              @KingCrunch

              hab mal eine Spalte angelegt (nummerisch) und ändere diese wia Cron alle 15min.
              Die Ausgabe wird nach der Spalte sortiert.
              Das Skript funktioniert scheinbar gut (teste noch).

              Danke Für eure Hilfe :wink:
              Gruß JEGO ;-)

              Ein PHP Script tut, was Du schreibst, nicht was Du willst.

              Kommentar


              • #8
                oder du machst dir die Tatsache zunutze, daß RAND() bei MySQL auch mit einem Parameter bestückt werden kann mit dessen Hilfe du den "Zufall" steuern kannst.

                Hier würde sich dann ORDER BY RAND(SessionId) anbieten.

                Die "zufälllige" Sortierung bleibt dann für die gesamte Session erhalten.

                Kommentar


                • #9
                  Interessante Lösung. Danke für die Info wusste ich noch nicht.

                  Kommentar


                  • #10
                    Zitat von DiBo33
                    oder du machst dir die Tatsache zunutze, daß RAND() bei MySQL auch mit einem Parameter bestückt werden kann mit dessen Hilfe du den "Zufall" steuern kannst.

                    Hier würde sich dann ORDER BY RAND(SessionId) anbieten.

                    Die "zufälllige" Sortierung bleibt dann für die gesamte Session erhalten.
                    Das steuert aber nur die Zufallsgenierung, aber das sorgt nicht dafür, dass die "Zufallszahl" im Rahmen der Session identisch bleibt. Ergo hätte er zwar ne feste Folge von Zufallszahlen, aber bei jedem Aufruf trotzdem eine andere (solange bis sich eben die Folge wiederholt ).
                    Nicht jeder Fehler ist ein Bug.

                    Kommentar


                    • #11
                      so jetzt hab ich ein join problem.

                      ich hab ne tabelle in der anfragen gespeichert werden.
                      in einer 2. tabelle stehen anfragen die der User nicht sehen will.
                      in der 2. Tabelle steht nur die user_id und die anfragen_id der Anfrage die er nicht sehen will.

                      PHP-Code:

                      $sql 
                      "SELECT *
                      FROM anfragen_anzeigen
                      JOIN anfragen_ausblenden ON anfragen_anzeigen.id != anfragen_ausblenden.id
                      AND anfragen_ausblenden.user_id = '"
                      .$user."'
                      ORDER BY spalte DESC"

                      mit der Abfrage versuche ich nur die Anfragen anzeigen zulassen die nicht in der 2.tabelle stehen. jedoch bekomme ich die letzte gemachte anfrage zigmal angezeigt.

                      Kann mir wer sagen was ich am JOIN falsch verstanden habe?
                      EDIT

                      Ok wie ich sehe, vergleicht mysql durch das "!=" jede Anfage mit jedem Datensatz aus tabelle 2. da dort ca.200 Einträge pro user sind, bekomm ich 200 mal jede Anfragen angezeigt.

                      nehm ich das "!=" weg und mach ein "=" draus, werden mir alle Anfragen angezeigt die der User nicht haben will. :wink:

                      Ich brauch aber das Gegenteil.

                      Auch INNER JOIN hilft mir irgendwie nicht weiter...
                      Gruß JEGO ;-)

                      Ein PHP Script tut, was Du schreibst, nicht was Du willst.

                      Kommentar


                      • #12
                        wie wärs mit
                        PHP-Code:
                        <?php $sql "SELECT *
                        FROM anfragen_anzeigen
                        JOIN anfragen_ausblenden ON anfragen_ausblenden.user_id = '"
                        .$user."'
                        WHERE anfragen_anzeigen.id != anfragen_ausblenden.id ORDER BY spalte DESC"
                        ;
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          @nikosch77

                          passiert genau das gleiche. die anzeigen werden x mal wiederholt.
                          Gruß JEGO ;-)

                          Ein PHP Script tut, was Du schreibst, nicht was Du willst.

                          Kommentar


                          • #14
                            kannst du vielleicht mal eine elementare struktur der relevanten tabellen posten. ich kann das alles nur bedingt nachvollziehen...
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar


                            • #15
                              klar kann ich das

                              Tabelle 1

                              id | anfrage | etc. alle Daten der Anfrage.

                              Tabelle 2

                              user_id | anfrage_id | Hier sind die anfragen_id´s drin die ein User nicht sehen will.

                              Ziel ist es nur die Anfragen aus Tabelle 1 anzuzeigen die nicht in Tabelle 2 stehen.
                              das geht jedoch nicht mit "!=" da mysql jede anfrage aus Tabelle 1 mit allen daten des Users aus Tabelle 2 vergleicht und demensprechend oft ausgibt.

                              hat also ein User 200 Anfagen die er nicht sehen will, vergleicht mysql jede anfrage aus Tabelle 1 mit den Daten aus Tabelle 2 und gibt jede Anzeige die er sehen will 200 mal aus. (mit der abfrage siehe oben)
                              Gruß JEGO ;-)

                              Ein PHP Script tut, was Du schreibst, nicht was Du willst.

                              Kommentar

                              Lädt...
                              X