ilch Forum » Allgemein » HTML, PHP, SQL,... » Left Join

Geschlossen
  1. #1
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Hallo ich habe ein Problem mit Left Joins, ich schaffe es nicht die Syntax richtig zu schreiben für die Abfrage. Da wollte ich mal Fragen ob mir wer Hilft dabei oder sie eventuell richtig stellt.

    Tab1: prefix_pager Felder: id, pid, timestamp, name, text, recht.

    Tab2: prefix_pagercat Felder: id, name

    Ich will von pid aus Tab1 in den name von Tab 2 haben, die pid hat jeweils eine id von Tab2. Oder ein bsp. auf dem Script recht -9 wird in den Name umgewandelt (Admin) für die Ausgabe. Ich habe schon einige Tutorials gelesen aber die Bringen immer wieder den gleichen Fehler. Bitte um Hilfe.

    mein Letzter test:
    SELECT id, prefix_pagercat.name, name, timestamp, text, recht FROM prefix_pager 
    LEFT JOIN prefix_pagercat ON prefix_pagercat.id = prefix_pager.pid
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Hey, Balthazar3k!

    So sollte es gehen!
    Dein Fehler war bestimmt das du 2 mal die selbe Variable benutzt hast, also "name"! Natürlich kann auch deine Abfrage an sich Falsch sein!
    Verwendest du "db_query()" (richtig) oder "mysql_query()" (falsch) ?
    Weil durch "db_query()" das prefix_ durch dein prefix (ic1) ersetzt wird!
    SELECT id, prefix_pagercat.name as cat_name, name, timestamp, text, recht FROM prefix_pager 
    LEFT JOIN prefix_pagercat ON prefix_pagercat.id = prefix_pager.pid


    Mit böhsen Grüßen
    BöhserDavid
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Morgen, und huhu Bösermann ^^
    Funktioniert leider nicht "cat_name" habe ich auch nicht mit drinne hier sagt er den Fehler "Column 'id' in field list is ambiguous" was auch immer das heißt kann leider nicht besonders gut englisch.

    also habe ich cat_name von tab2 in id von Tab2 geändert.

    ja das mit db_query benutze ich für das prefix immer habe meine Fehler schon daraus gelernt mit mysql_query zu arbeiten ^^

    hier mit lasse ich auch einfach die SQL durch laufen um sie zu Testen
    <?php 
    defined ('main') or die ( 'no direct access' );
    
    $title = $allgAr['title'].' :: MySQL Anzeigen';
    $hmenu = 'MySQL Anzeigen';
    $design = new design ( $title , $hmenu );
    $design->header();
    
    $tpl = new tpl ( 'db_show.htm' );
    
    $Cnorm = 'Cnorm';
    $Cmite = 'Cmite';
    $Class = $Cnorm;
    
    if( isset( $_POST['sql'] ) &&  $_POST['sql']  != "" ){
    	$sql = $_POST['sql'];
    }else{
    	$sql = 'SELECT * FROM prefix_pager';
    }
    
    $res = db_query( $sql );
    $anz = mysql_num_fields($res);
    $num = mysql_num_rows($res);
    #$breite = 100 / $anz . "%";
    
    $table = "SQL : ". $sql ."<br><br>";
    $table .= "<table width='100%' border='0' cellpadding='0' cellspacing='1' class='border'>";
    $table .= "<tr>";
    
    for($a=0; $a < $anz; $a++ ){
    	$table .= "<td class='Chead' ><center><b>". mysql_field_name($res,$a) ."</b></center></td>";
    }
    
    $table .= "</tr>";
    for($b=0; $b < $num; $b++ ){
    
    	if( $Class == $Cnorm ){ $Class = $Cmite; }else{ $Class = $Cnorm; }
    	
    	$table .= "<tr class='".$Class."'>";
    	$row = mysql_fetch_array($res);
    	for($c=0; $c < $anz; $c++){
    		$fn = mysql_field_name($res,$c);
    		$table .= "<td valign='top'>". $row[$fn] ."</td>";
    	}
    	$table .= "</tr>";
    }
    
    $table .= "</table>";
    
    $tpl->set_ar_out(array("tabout" => $table ),0);
    $design->footer();
    ?>


    vieleicht liegt der fehler auch hier drinne, aber sie läst sich mit normalen SELECTs immer abfragen.

    Letzter versuch
    SELECT id, prefix_pagercat.name as id, name, timestamp, text, recht FROM prefix_pager  
    LEFT JOIN prefix_pagercat ON prefix_pagercat.id = prefix_pager.pid



    Zuletzt modifiziert von Balthazar3k am 30.07.2007 - 11:11:58
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    id kommt in beiden Tabellen vor, deswegen musst du noch den Tabellennamen davor setzen.
    Das cat_name ist auch nur ein alias für die Abfrage deswegen as cat_name (als cat_name), das muss nicht in der Datenbank vorkommen.


    Zuletzt modifiziert von Mairu am 30.07.2007 - 12:48:05
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Also darf ich das so verstehn das es dann so sein muss das nach dem "AS prefix_pagercat.id" so stehen muss als austausch von (alias) cat_name? Ich habe gerade das Gefühl das ich etwas schwer von Begriff bin grumml

    Test
    SELECT id, prefix_pagercat.name as prefix_pagercat.id, name, timestamp, text, recht FROM prefix_pager   
    LEFT JOIN prefix_pagercat ON prefix_pagercat.id = prefix_pager.pid


    Ergrbnis: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.id, name, timestamp, text, recht FROM ic1_pager LEFT JOIN ic1_pagercat ON i' at line 1
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Nein, pass auf!

    Wenn du Daten von 2 Tabellen abfragst, die aber beide eine selbe Spalte haben (in diesem Fall "name") ist die Zuordnung zu der Varibale "name" nicht gewährleistet, weil einmal name und einmal name (aber aus der anderen Tabelle), also vergibt man für einen der beiden "namen" einen Begriff mit "as" der in keiner der beiden Tabellen vorkommt wie "cat_name", also ist jetzt "cat_name = prefix_pagercat.name" .
    Soweit klar?
    Jetzt kann du mit der Variable "cat_name" weiterarbeiten!

    Und der 'Column 'id'.... Fehler kommt wahrscheinlich wegen
    $anz = mysql_num_fields($res);
    $num = mysql_num_rows($res); // ersetzen durch db_num_rows

    *EDIT: Ich seh gerade das du viel mit mysql arbeitst, dann kann du aus "prefix_" -> "ic1_" machen und aus den "db_" wieder "mysql_"
    lol


    Zuletzt modifiziert von boehserdavid am 30.07.2007 - 13:50:45
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Also nochmal es gibt nicht nur 2-mal name sondern auch 2-mal id, also
    SELECT prefix_pager.id, prefix_pagercat.name as cat_name, name, timestamp, text, recht FROM prefix_pager   
    LEFT JOIN prefix_pagercat ON prefix_pagercat.id = prefix_pager.pid
    und dann eben db_query usw. verwenden nicht mysql_query, warum wurde bereits erwähnt.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Aso da ich id und name in beiden tabellen habe gibt es eine zuordnug aus welcher tabelle es abgefragt wird.

    Zu den cat_name wird mir dann als $row->cat_name ausgegeben.

    Also
    SELECT
     prefix_pager.id,
     prefix_pagercat.name as cat_name,
     prefix_pager.name,
     timestamp,
     text,
     recht 
    FROM prefix_pager
    LEFT JOIN prefix_pagercat ON prefix_pager.pid = prefix_pagercat.id
    da ist aber immer noch ein fehler drinne ich habe wieder eine fehler meldung drinne.

    Ich habe auch
    SELECT
      posts,
      prefix_user.id,
      prefix_grundrechte.name as recht_name,
      regist,
      prefix_user.name
    FROM prefix_user
     LEFT JOIN prefix_grundrechte ON prefix_user.recht = prefix_grundrechte.id
    aus der memb_list.php durch mein script gejagt und die geht und damit geht auch mein script.


    Zuletzt modifiziert von Balthazar3k am 30.07.2007 - 15:17:29
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Was kommt denn für ein Fehler?
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    aber es ist doch auch egal was ich nach db_query verwende im script da eh alles nach db_query mit einem einfachem return zurück gegeben wird? FEhler "Unknown column 'ic1_pagercat.name' in 'field list'"


    Zuletzt modifiziert von Balthazar3k am 30.07.2007 - 15:23:07
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  11. #11
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Das mit dem db_query stimmt nicht, weil der eigentliche Befehl heißt mysql_query, db_query ist dafür da und prefix_ in ic1_ oder ic2_, je nach dem was du in der installation angegeben hast, zu "verwandelt"!
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  12. #12
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Bei dem Fehler, schau doch nochmal nach wie der Feldname heißt, vielleich hattest du dich verschrieben?
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  13. #13
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Ach wie GEIL lächelnlachen es geht, muss mich entschuldigen und mega bedanken dank euch versteh ich endlich LEFT JOIN, und der Letzte Fehler lagt wirklich an meiner dummheit da in pagercat nicht Name sondern catname ist oO aber ich kann versichern das ich das vorher schon mehrmals mit catname getestet habe natürlich erfolglos.

    Danke danke für eure geduld und mühe^^
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  14. #14
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Habe leider ein vortsetzung bin dabei noch eine Tabelle hinzu aber habe da ein Problem.

    SELECT 
    p.id as p_id,
    p.name,
    c.catname,
    timestamp,
    text,
    g.name as recht_name
    FROM 
    ic1_pager AS p, 
    ic1_pagercat AS c, 
    ic1_grundrechte AS g 
    WHERE
    p.pid = c.id AND 
    p.recht = g.id


    ok Problem auch schon gelöst! Danke bye


    Zuletzt modifiziert von Balthazar3k am 30.07.2007 - 18:51:06
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  15. #15
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    Na ich nutze mal mein altes Thema hier für.

    Also ich habe jetzt ein Problem, da ich eine ART Hobby Programmierer bin weiß ich nicht nach was ich Googeln könnte.

    Ich habe das mal zusammengesetzt,
    <?php 
    		$res = db_query("SELECT 
    							a.gruppen, a.img, 
    							COUNT(ar.id) as aRaids, 
    							COUNT(er.id) as eRaids 
    						FROM prefix_raid_gruppen AS a
    							LEFT JOIN prefix_raid_raid AS ar ON a.id=ar.gruppen 
    							LEFT JOIN prefix_raid_raid AS er ON a.id=er.gruppen
    						WHERE 
    							ar.statusmsg = 1 AND 
    							er.statusmsg = 2 
    						GROUP BY a.gruppen");
    ?>


    Erst mal bekomme ich keine Fehlermeldung, nur die Ausgabe von 'aRaids' und 'eRaids' sind identisch und das war ja eigentlich nicht mein Ziel und sollte laut Datenbankeinträge garnicht zu diesen zahlen führen, also habe ich ein Fehler oder es ist garnicht möglich.

    Erstmal die Frage ist es Überhaupt möglich 2x eine Aggregatfunktionen aus einer Tabelle in der DB Abfrage auszulesen?

    Wenn ja:
    Könnte mich wer vielleicht auf den Richtigen weg Bringen, wonach ich suchen sollte, vielleicht auch selber Hinweise geben? PLZ

    Im Beispiel versuche ich im LEFT JOIN 2x die tabelle prefix_raid_raid auszuzählen, gemeinsames Feld aus prefix_raid_raid ist 'gruppen' danach würde ich es gerne noch mal auf Trennen mit dem Feld 'statusmsg' das es mir einmal die Datensätze aus dem Feld 'statusmsg' mit dem wert 1 auszählt und danach mit dem wert 2 noch mal das gleiche tut.

    Noch Probiert habe ich:
    <?php
    		$res = db_query("SELECT 
    							a.gruppen, a.img, 
    							COUNT(ar.id) as aRaids, 
    							COUNT(er.id) as eRaids 
    						FROM prefix_raid_gruppen AS a
    							LEFT JOIN prefix_raid_raid AS ar ON a.id=ar.gruppen AND ar.statusmsg = 1
    							LEFT JOIN prefix_raid_raid AS er ON a.id=er.gruppen AND er.statusmsg = 2 	
    						GROUP BY a.gruppen");
    ?>


    Bei dem bekomme ich auch keine Fehlermeldungen.

    M.f.G. B3k
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  16. #16
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    1. Feldnamen werden mit as in eine andere Variable umgewandet Tabellen nicht.
    Und du zählst ja auch 2x das selbe, einmal prefix_raid_raid.id und prefix_raid_raid.id
    <?php 
    $res1 = db_query("SELECT a.gruppen, a.img,
                                   COUNT(prefix_raid_raid.id) as aRaids, 
                                  FROM prefix_raid_gruppen a
                                  LEFT JOIN prefix_raid_raid ar ON
                                   ar.gruppen = a.id
                                  WHERE
                                   ar.statusmsg = 1
                                  GROUP BY a.gruppen");
    $res2 = db_query("SELECT a.gruppen, a.img,
                                   COUNT(prefix_raid_raid.id) as aRaids, 
                                  FROM prefix_raid_gruppen a
                                  LEFT JOIN prefix_raid_raid ar ON
                                   ar.gruppen = a.id
                                  WHERE
                                   ar.statusmsg = 2
                                  GROUP BY a.gruppen");
    ?>


    So sollte das aussehen, aber die Datenbank struktur kenn ich ja nicht, deswegen geh ich mal davon aus, dass das so richtig ist.
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  17. #17
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Naja also nur weil man kein AS bei Tabellen braucht ist es nicht falsch!
    Es gibt auch Möglichkeiten das in einer Abfrage zu vereinigen, ist dann aber schon ein bisschen heavy lächeln

    SELECT b.id, b.gruppen, b.img, b.aRaids, COUNT(er.id) AS eRaids FROM (
     SELECT a.id, a.gruppen, a.img, COUNT(ar.id) AS aRaids
      FROM prefix_raid_gruppen AS a LEFT JOIN prefix_raid_raid AS ar ON a.id = ar.gruppen   
       WHERE ar.statusmsg = 1 GROUP BY a.id, a.gruppen, a.img
     ) AS b LEFT JOIN prefix_raid_raid AS er ON b.id = er.gruppen
      WHERE er.statusmsg = 2 GROUP BY b.id, b.gruppen, b.img, b.aRaids


    oder aber auch

    SELECT a.gruppen, a.img, COUNT(ar.id) AS aRaids, (SELECT COUNT(er.id) FROM prefix_raid_raid AS er WHERE er.statusmsg = 2 AND a.id = er.id) AS eRaids
      FROM prefix_raid_gruppen AS a LEFT JOIN prefix_raid_raid AS ar ON a.id = ar.gruppen   
    WHERE ar.statusmsg = 1 GROUP BY a.gruppen, a.img


    wobei das 2. sicherlich noch einfacher zu verstehen ist, von der Geschwindigkeit, sind die beiden Abfragen recht ähnlich, aber eine Abfrage theoretisch schneller sein sollte als 2.


    Zuletzt modifiziert von Mairu am 31.05.2008 - 15:11:48
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  18. #18
    User Pic
    Balthazar3k Mitglied
    Registriert seit
    23.04.2006
    Beiträge
    422
    Beitragswertungen
    7 Beitragspunkte
    @boehserdavid: So was in der Art habe ich in der Tat auch schon mal Probiert, was bei dieser Abfrage auch nicht wirklich eine Rolle spielt, aber das ist nicht das einzigste was ich gerne mit mehr aggregatfunktionen machen würde, später an einer anderen stelle im Script würde ich das gerne noch mit 3xSUM() machen, nur das ich das diesmal noch mit ORDER BY machen müsste damit es eine Rang Liste ergibt.

    @mariu: mega THX deine Beispiele haben nicht gleich funktioniert aber sie waren sehr Lehrreich. dein 2te Version habe ich gleich übernommen und das daraus gemacht, mit dem Ergebnis den ich erwartet habe.

    <?php
    		$res = db_query("SELECT a.gruppen, a.img, 
    							COUNT(ar.id) AS aRaids, 
    							(SELECT COUNT(id) FROM prefix_raid_raid AS er WHERE a.id = er.gruppen AND er.statusmsg = 2) AS eRaids 
     						 FROM prefix_raid_gruppen AS a 
    						 	LEFT JOIN prefix_raid_raid AS ar ON a.id = ar.gruppen AND ar.statusmsg = 1 
    						 GROUP BY a.gruppen, a.img");/*
    ?>


    Danke an euch zwein ^^


    Zuletzt modifiziert von Balthazar3k am 31.05.2008 - 12:49:45
    Kein Support für den Raidplaner über PM.
    0 Mitglieder finden den Beitrag gut.
  19. #19
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Oh da fehlte ein FROM, naja ich habs mit anderem Sachverhalt getestet, hab deine Tabellen ja nicht.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten