deviN: Was ist schneller: LEFT JOIN oder IF Abfragen

Hallo alle zusammen. Ich habe ein kleines Forum.
Bei der Auflistung der einzelnen Beiträge werden immer die Ränge der User angezeigt. Damit dies passieren kann muss bei der Datenbankabfrage ein LEFT JOIN gemacht werden:

SELECT p.beitrag, p.userposts, p.rankid, r.* FORM posts p LEFT JOIN ranks r ON (p.rankid=r.rankid)

Nun überlege ich den LEFT JOIN zu streichen und die Ränge durch If-Abfragen in der While-Schleife ausgeben zu lassen. Ungefähr so:

$result = mysql_query("SELECT  p.beitrag, p.userposts FORM posts p WHERE p.postid in ($postids)");  
while($posts = mysql_fetch_array($result)) {  
if($posts['userposts']<10) {$rank="...";}  
elseif($posts['userposts']<20) {$rank="...";}  
elseif($posts['userposts']<30) {$rank="...";}  
elseif($posts['userposts']<40) {$rank="...";}  
elseif($posts['userposts']<50) {$rank="...";}  
...  
elseif($posts['userposts']<500) {$rank="...";}  
}

Ist dies überhaupt sinnvoll? Was ist der schnellere Weg?

  1. Hi deviN!

    Was ist der schnellere Weg?

    $ranks = array('Anfänger', 'Fortgeschrittener', 'Profi' /* ... */);  
    $rank = $ranks[min(floor($posts['userposts'] / 10), 50)];
    

    Eventuell kannst du auch eine Funktion zu Ermittlung des Index´ schreiben.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Moin!

    Ist dies überhaupt sinnvoll? Was ist der schnellere Weg?

    Das kommt ganz darauf an ob der Server mit Deiner Datenbank schnarchlangsam ist und der mit dem PHP sehr schnell - oder anders herum.

    Die Merkmale für die Ranks (20 ... 500) sind allerdings Daten und gehören deswegen nicht ins Programm. Zudem ist in der Datenbank alles schon in Maschinensprache codiert und muss, anders als die Skriptsprache PHP nicht mehr vor der Ausführung übersetzt werden...

    Möglicherweise solltest Du geeignete Indizes setzen allerdings erscheint mir Deine Tabelle ranks sehr kurz, das dürfte kaum was ausmachen.

    Hast Du schon mal überlegt eine view anzulegen und diese - dann ohne Join - abzufragen?

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hast Du schon mal überlegt eine view anzulegen und diese - dann ohne Join - abzufragen?

      Nein das habe ich noch nicht. Bis eben war mit der Themenbereich der Views auch noch neu. Ich ha be zwar ein wenig gegoogelt aber über einen genauen sinn dieser anwendung bin ich jetzt noch nicht gestoßen. Wieso meinst du, dass ein view hier sinnvoll wäre?

      1. Moin!

        Wieso meinst du, dass ein view hier sinnvoll wäre?

        Du sparst Dir die Joins und das DBMS ist auf die Fragen quasi vorbereitet :)

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

  3. Hi DeviN,

    Nun überlege ich den LEFT JOIN zu streichen und die Ränge durch If-Abfragen in der While-Schleife ausgeben zu lassen. Ungefähr so:

    $result = mysql_query("SELECT  p.beitrag, p.userposts FORM posts p WHERE p.postid in ($postids)");

    while($posts = mysql_fetch_array($result)) {
    if($posts['userposts']<10) {$rank="...";}
    elseif($posts['userposts']<20) {$rank="...";}
    elseif($posts['userposts']<30) {$rank="...";}
    elseif($posts['userposts']<40) {$rank="...";}
    elseif($posts['userposts']<50) {$rank="...";}
    ...
    elseif($posts['userposts']<500) {$rank="...";}
    }

    
    >   
    > Ist dies überhaupt sinnvoll? Was ist der schnellere Weg?  
      
    Da die Tabelle mit den Rängen ja recht überschaubar sein dürfte, wäre nichtmal unbedingt ein Index auf dem foreign key notwendig.  
      
    In der Regel funktionieren Joins sehr schnell, und du gibst ja auch die Spalten an, die du benötigst. Ich würde mir da weiter keine Gedanken machen. Natürlich wenn man auf die Tabelle verzichten möchte, möglich sind bei MySql zb auch solche Dingens:  
      
    SELECT rankid,  
    CASE  
    WHEN rankid<10 THEN 'bla'  
    WHEN rankid<20 THEN 'blö'  
    WHEN rankid<30 THEN 'blu'  
    ...  
    ELSE 'blech' END rank\_name  
    FROM posts;