Rand und Join

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

  • Rand und Join

    Hi !!

    Ich habe folgendes SQL-Statement.

    PHP-Code:
    $linkstemp="SELECT *, login.************ FROM votingpics  ";
    $linkstemp.="LEFT JOIN login ";
    $linkstemp.="USING (user_id) ";
    $linkstemp.="WHERE login.************ = 'm' ";
    $linkstemp.="ORDER by RAND() DESC LIMIT 1"
    Und ich bekomme immer denselben Tupel als Ergebnis.
    Wenn ich die WHERE-Klausel weglasse, funktioniert alles und ich bekomme mit jedem Aufruf einen anderen Tupel angeliefert - ich kann aber nicht filtern ...

    Funktionieren Where-Klauseln, die auf JOINS basieren in Statements mit Rand() nicht oder ist es einfach mal wieder nur zu spät geworden ? *g*
    Zuletzt geändert von DaGuertliz; 04.04.2004, 00:05.
    Yeah !

  • #2
    auch wenn die abfrage imho nicht schön ist, läuft sie im pma wie
    gewünscht ... browser-cache problem?
    Kissolino.com

    Kommentar


    • #3
      Bei mir mags auch nicht funzen, wenn ich den Cache leere ...

      auch wenn die abfrage imho nicht schön ist
      Ich stehe Verbesserungsvorschlägen offen gegenüber ;-)
      Yeah !

      Kommentar


      • #4
        verbesserung:
        du die spalten, die du haben willst, explizit ansprechen:
        PHP-Code:
        $linkstemp="
        SELECT 
             v.spalte1, 
             v.spalte2, 
             v.spalte3, 
             l.************ 
        FROM votingpics v 
        INNER JOIN login l USING (user_id)
        WHERE l.************ LIKE 'm' 
        ORDER by RAND() DESC 
        LIMIT 1"

        ... dabei seh ich grad, dass du login keinen alias zugewiesen hattest, probiers mal damit ^^
        Kissolino.com

        Kommentar


        • #5
          PHP-Code:
          $linkstemp="SELECT v.user_id, v.name, l.************ ";
          $linkstemp.="FROM votingpics v ";
          $linkstemp.="INNER JOIN login l ";
          $linkstemp.="USING (user_id) ";
          $linkstemp.="WHERE l.************ LIKE 'm' ";
          $linkstemp.="AND v.user_id != '".$_SESSION['user_id']."' ";
          $linkstemp.="ORDER by RAND() DESC LIMIT 1"
          Immer das Gleiche ... *seufz*

          Wenn ich "DESC weglasse, bekomme ich den ersten greifbaren Tupel, wenn ich es hinschreibe den letzten ...
          Yeah !

          Kommentar


          • #6
            DESC ist afaik schwachfug bei RAND() ... lass es mal weg und schmeiss
            auch mal das limit raus ... ändert sich die reihenfolge der ausgegebenen
            datensätze?
            Kissolino.com

            Kommentar


            • #7
              wenn ich das DESC rauskicke zeigt er wie gesagt anstelle des letzten den ersten Datensatz an.
              Das Limit 1 habe ich angefügt, weil ich nur einen einzigen zufälligen Datensatz in meinem array möchte - und nicht die ganze tabelle ...

              Wenn ich das LIMIT weglasse ändert sich aber gar nichts ...

              Es ist auch völlig wurscht, ob ich das Ergebnis mit mysql_fetch_array oder in einer Schleife mit mysql_fetch_object abfrage ...

              Was ich aber echt megakomisch finde :
              Wenn ich genau das Gleiche Statement nochmal abfrage, funktioniert es ...

              PHP-Code:
              $linkstemp="SELECT v.user_id, v.name, l.************ ";
              $linkstemp.="FROM votingpics v ";
              $linkstemp.="INNER JOIN login l ";
              $linkstemp.="USING (user_id) ";
              $linkstemp.="WHERE l.************ LIKE 'm' ";
              $linkstemp.="AND v.user_id != '".$_SESSION['user_id']."' ";
              $linkstemp.="ORDER by RAND() LIMIT 1";
              $test=mysql_query($linkstemp) or die (mysql_error());
              $erg=mysql_fetch_array($test);

              $rechtstemp="SELECT v.user_id, v.name, l.************ ";
              $rechtstemp.="FROM votingpics v";
              $rechtstemp.="LEFT JOIN login l";
              $rechtstemp.="USING (user_id) ";
              $rechtstemp.="WHERE l.************ = 'm' ";
              $rechtstemp.="AND votingpics.user_id != '".$erg['user_id']."' ";
              $rechtstemp.="ORDER by RAND() LIMIT 1";
              $erg2=mysql_fetch_array(mysql_query($rechtstemp)); 
              Also $rechtstemp gibt einen zufälligen Datensatz aus, während $linkstemp immer das Gleiche liefert

              *grübel*
              Yeah !

              Kommentar


              • #8
                hmm.... bei mir laufen beide wie gewünscht (MySQL 4.0.12) ... liegts an der
                version? vielleicht weiss einer der sql-profis, warum das so ist? aber wenn
                der LEFT JOIN das gewünschte liefert, nimm den doch.
                Kissolino.com

                Kommentar


                • #9
                  Auf meinem Server ist MySQL 3.23.55 drauf.

                  Ob ich einen INNER oder einen LEFT JOIN mache ist völlig Wurscht - das Ergebnis ist immer das Gleiche ... vielleicht sollte ich einfach drei Abfragen machen - und nur die zweite und dritte anzeigen ;-))

                  vielleicht weiss einer der sql-profis, warum das so ist?
                  Vielleicht nimmt sich einer von denen ja mal meines Problems an ... Dir aber schon mal vielen vielen Dank für Deine Mühe !!! :-)
                  Yeah !

                  Kommentar


                  • #10
                    mysql.de:
                    Beachten Sie, dass ein RAND() in einer WHERE-Klausel jedes Mal von Neuem ausgewertet wird, wenn WHERE ausgeführt wird.
                    würde erklären, warum das
                    PHP-Code:
                    $linkstemp="SELECT v.user_id, v.name, l.************ ";
                    $linkstemp.="FROM votingpics v ";
                    $linkstemp.="INNER JOIN login l ";
                    $linkstemp.="USING (user_id) ";
                    $linkstemp.="WHERE l.************ LIKE 'm' ";
                    $linkstemp.="AND v.user_id != '".$_SESSION['user_id']."' ";
                    $linkstemp.="ORDER by RAND() LIMIT 1";
                    $test=mysql_query($linkstemp) or die (mysql_error());
                    $erg=mysql_fetch_array($test); 
                    immer denselben datensatz liefert ... rand() von einem ds ist immer derselbe wert ... wenn ichs richtig verstehen, sollte das:
                    PHP-Code:
                    $linkstemp="SELECT v.user_id, v.name, l.************ ";
                    $linkstemp.="FROM votingpics v ";
                    $linkstemp.="INNER JOIN login l ";
                    $linkstemp.="USING (user_id) ";
                    $linkstemp.="WHERE v.user_id != '".$_SESSION['user_id']."' ";
                    $linkstemp.="AND l.************ LIKE 'm' ";
                    $linkstemp.="ORDER by RAND() LIMIT 1";
                    $test=mysql_query($linkstemp) or die (mysql_error());
                    $erg=mysql_fetch_array($test); 
                    laufen.
                    Kissolino.com

                    Kommentar


                    • #11
                      Hmmmmm ... Nöööö, geht auch nicht ;-)
                      Es muß damit zu tun haben, daß ich nach einem Wert aus der gejointen Tabelle (l.************)filtern möchte. Wenn ich nur nach Werten aus der v. tabelle mit where filtere, geht es ...

                      Viel mehr gibt mir aus der PHP-Doku zu rand() folgendes zu denken ...
                      Benutzen Sie unbedingt srand(), um vor dem ersten Aufruf von rand() einen neuen Startwert festzulegen, ansonsten erhalten Sie bei jedem Programmlauf dieselbe Sequenz von Werten.
                      Ob das bei Mysql analog ist ?!?
                      Yeah !

                      Kommentar


                      • #12
                        Original geschrieben von DaGuertliz
                        Ob das bei Mysql analog ist ?!?
                        nö.

                        ich benutze (sql) rand() häufiger auch bei verschiedenen sql-versionen ... ohne
                        probleme ... einzige ausnahme: je weniger datensätze, desto weniger rand()
                        ... alternative: auslesen ohne rand(), ergebnis in ein array und die php-
                        funktionen auf das ergebnis-array anwenden dabei zufällig einen datensatz
                        auswählen.
                        Kissolino.com

                        Kommentar


                        • #13
                          Ich löse das Problem jetzt mit ner Fußgesteuerten Schleife ... und er soll dann solange einen zufälligen Datensatz raussuchen, bis l.************ endlich mal w - oder eben m ist.

                          Ist zwar nicht die Leitungslösung - aber man kann ja nicht alles haben ;-)
                          Yeah !

                          Kommentar

                          Lädt...
                          X