LEFT JOIN (4Tabellen) mit * schneller als m. AS ?!?!

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

  • LEFT JOIN (4Tabellen) mit * schneller als m. AS ?!?!

    Halli hallo,

    also ich hab gerade ne ganz einfach Ausgabe von Datensätzen programmiert und hab zuerst dafür "LEFT JOINS" benutzt für die 4 Tabellen benutzt...

    jetzt is folgendes passiert hab zuerst alle FELDER mit * ausgeben lassen:

    SELECT * FROM s_artikel AS t1
    LEFT JOIN s_marke AS t3 ON t1.id_marke = t3.id_marke
    LEFT JOIN s_zuweisung AS t2 ON t1.id_artikel = t2.id_artikel
    LEFT JOIN s_bild AS t4 ON t1.id_artikel = t4.id_artikel
    WHERE t4.id_artikel IS NULL
    GROUP BY t2.id_artikel
    ORDER BY t1.last_update_steps DESC

    ging ratz fatz hab keine sekunde auf die 300 Datensätze warten müssen.

    Nun hab ich einfach noch ein Spaltenname selbst benannt weil er mir id_artikel immer der letzten Tabelle den Wert nimmt und dadurch bei ein paar NULL drin hat(ist auch so gewollt da ich überprüfen muss wo keine Bilder hochgeladen wurden also -> IS NULL)
    dachte ich mir allesklar kein Problem nehm ich halt einfach nen eigenen Name mit t1.id_artikel as id_artikel:

    SELECT *, t1.id_artikel as id_artikel
    FROM s_artikel AS t1
    LEFT JOIN s_marke AS t3 ON t1.id_marke = t3.id_marke
    LEFT JOIN s_zuweisung AS t2 ON t1.id_artikel = t2.id_artikel
    LEFT JOIN s_bild AS t4 ON t1.id_artikel = t4.id_artikel
    WHERE t4.id_artikel IS NULL
    GROUP BY t2.id_artikel
    ORDER BY t1.last_update_steps DESC

    funzt natürlich auch wie gewollt allerdings dauert das ganze jetzt rund 2-3Sekunden langsammer was mich schon sehr verwundert da es doch eigentlich schnell auslesen müsste(hab auch mal nur ein FELD ohne * gemacht gleiche Ergebnis)

    Hab dazu auch schon so ein Threads hier gefunden, allerdings suche ich jetzt ne Methode wie ich irgendwie beim auslesen(imo mit mysql_fetch_object) die tabellen name mit angeben kann also direkt ansprechen.

    zb $row->t1.id_artikel;

    hab mir auch mal mysql_fetch_object ausgeben lassen:

    =====================================

    stdClass Object ( [id_artikel] => [id_marke] => 4 [titel] => Lozan Tongue Twister [beschreibung] => Smarter Sneaker für alle Fre.... [preis] => 84.90 [spreis] => 0.00 [farbe1] => 0 [farbe2] => 0 [aktiv] => 1 [hersteller_nr] => 0660927 [id_geschlecht] => 0 [last_update_steps] => 2007-03-22 10:05:07 [cross_artikel] => [views] => 57 [marke] => K.SWISS [id_zuweisung] => 232 [id_artikelart] => 0 [id_verwendung] => 0 [id_bild] => [bildpfad] => )

    =====================================

    Allerdings gruppiert er die spalten namen ja dann anscheinend bzw überschreibt gleich spalten namen mit dem der zuletzten Tabelle vorhandenen.

    Ist es möglich mit * den query so zu lassen und die verschiedenen Felder dann direkt anzusprechen?

    hier mein ausleseverfahren in PHP:

    PHP-Code:

    $sel_artikel                        
    "SELECT * 
                         FROM 
    $tbl_artikel AS t1
                         LEFT JOIN 
    $tbl_marke AS t3 ON t1.id_marke = t3.id_marke
                         LEFT JOIN 
    $tbl_zuweisung AS t2 ON t1.id_artikel = t2.id_artikel
                         LEFT JOIN 
    $tbl_bild AS t4 ON t1.id_artikel = t4.id_artikel
             
    $filter
             GROUP BY t2.id_artikel
             ORDER BY t1.last_update_steps DESC"
    ;
                                        
        
        
    $res_artikel mysql_query($sel_artikel);
        echo 
    mysql_error();

    while(
    $row_artikel=mysql_fetch_object($res_artikel))
            {
            
    $m++;
            
    $tb_hersteller_nr    $row_artikel->hersteller_nr;
            
    $tb_id_artikel          $row_artikel->id_artikel;
                
            
                        
    print_r ($row_artikel);
                                    } 

  • #2
    Was du suchst ist tabellenname.* (ist wohl besser im SQL Forum augehoben).
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

    Kommentar


    • #3
      nein was ich such ist ohne im sqlquery tabellenname.spaltenname as nameneu

      direkt bei

      $row-> tabellenname.spaltenname;

      anzusprechen da so der query nur mit * viel schneller bei LEFT JOINS ist!
      Bin allerdings noch nicht draufgekommen weil er bei mysql_fetch_object bereits bestehende spaltennamen einfach mit dem wert ersetzt, den er findet. In dem Fall id_artikel der letzte($tbl_bild tabelle -> t4)

      Kommentar


      • #4
        $row-> tabellenname.spaltenname;
        Wie du evtl. verstehen kannst ist das nicht möglich. Wenn du mehre Spalten mit dem gleichen Namen hast wirst du nicht umhin kommen diese extra zu benennen. Trotzdem glaube ich nicht das du wirklich * brauchst, eine Beschränkung ist schneller und vermeidet evtl. doppelte Felder.
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          das ja das kurriose, ich hab auch gedacht das die einschränkung von haus aus schneller ist als einfach alles mit * anzusprechen.

          Entweder ist mein Script und special fall oder die Abfrage ändert sich noch stark wenn mehr treffer vorkommen oder weniger..mal sehen.

          Trotzdem danke :=)
          schönes We euch allen

          Kommentar

          Lädt...
          X