Rand und Join

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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*
    Last edited by DaGuertliz; 03-04-2004, 23: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

    Comment


    • #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 !

      Comment


      • #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

        Comment


        • #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 !

          Comment


          • #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

            Comment


            • #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 !

              Comment


              • #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

                Comment


                • #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 !

                  Comment


                  • #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

                    Comment


                    • #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 !

                      Comment


                      • #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

                        Comment


                        • #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 !

                          Comment

                          Working...
                          X