kostenloser Webspace werbefrei: lima-city


Verschachtelte MySql-Abfrage

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    squid

    Kostenloser Webspace von squid

    squid hat kostenlosen Webspace.

    Hi
    ich arbeite an einem Script, das eine verschachtelte MySql abfrage enthalten soll:


    $abfrage = "SELECT * FROM table1 WHERE category_id LIKE '$category' LIMIT 6";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
    {
    echo $row->name;
      $abfrage2 = "SELECT * FROM table2 WHERE id LIKE '$row->special_id' LIMIT 1";
      $ergebnis2 = mysql_query($abfrage2);
      while($row2 = mysql_fetch_object($ergebnis2))
          {
          echo $row2->inhalt;
          }
    }


    Um es einfacher zu erklären: Ich habe eine MySql Abfrage, und in jeder Ausgabe soll etwas ausgegeben werden, dass sich in einer anderen Tabelle befindet. Die Verbindung zur Datenbank steht übrigens, oben ist nur der wichtigste Code-Teil. Der unterschachtelte Teil scheint die erste Abfrage abzubrechen, denn (in der Tabelle sind mehrere EInträge) wenn der unterschachtelte Teil fehlt werden alle Einträge der ersten Abfrage ausgegeben (bzw. Maximal 6 wegen dem LIMIT), sobald die zweite Abfrage eingefügt wird, wird alles ab dort abgebrochen.
    Weiß jemand warum und wie man das Problem umgehen kann bzw. eine alternative Funktion?

    Danke im Voraus auf eure Hilfe!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. SELECT * FROM table1 LEFT JOIN table2 ON table1.special_id = table2.id WHERE table1.category_id LIKE '".$category."' GROUP BY table2.id


    Oder in Abfrage2 einfach das Limit weg lassen.

    Beitrag zuletzt geändert: 27.4.2011 1:19:35 von fabo
  4. e******n

    $abfrage2 = "SELECT * FROM table2 WHERE id LIKE '" .$row->special_id. "' LIMIT 1";


    oder schreib es so.

    Dein Fehler warum die zweite abfrage nicht ausgeführt worden ist, war das die Variable nicht in dem String erkannt worden ist.
    Als erstes zeigst du das es LIKE sein solls mit einfachen ' anführungstrich oder wie man das auch nennt, dannach benedest du den String fürs erste und verbindest eine Variable mit dem String.

    um ein string mit einer Variable zu verbinden oder auch zwei variablen mit dem inhalt eines strings zu verbinden wird ein punkt eingesetzt, daher brauchst du die beiden Punkte, einmal vor der Variable und einmal nach der Variable, denn die Abfrage ist ja noch nicht vollständig.

    So nun da du schonmal den ersten teil der abfrage mit der Variable verbunden hast, musst du nun einen zweiten string eröffnen in dem du " diese anführungsstriche verwendest und auch mit ' zeigen, das jetzt hier das LIKE zuende ist, nun stellst du weitere parameter der abfrage und beendest den string schließlich wieder mit ".

    wenn du die variable $abfrage2 mit echo ausgeben würdest, würde er dir halt die Varialbe durch den Wert ersetzen und eine vollständige sql abfrage erstellen.

    Nun sollte die zweite abfrage auch funktionieren.
  5. Ich glaube die das fogendes richtig(er) wäre:
    $abfrage2 = "SELECT * FROM table2 WHERE id LIKE '".$row[special_id]."' LIMIT 1";


    Zum testen:
    <?php
       $row = Array('special_id'=>'hallo','special_ig'=>'blup');
      $abfrage2 = "SELECT * FROM table2 WHERE id LIKE '$row->special_id' LIMIT 1";
      echo $abfrage2."<br>";
      $abfrage2 = "SELECT * FROM table2 WHERE id LIKE '".$row[special_id]."' LIMIT 1";
      echo $abfrage2;
    
      /* Ausgabe:
      SELECT * FROM table2 WHERE id LIKE '' LIMIT 1
      SELECT * FROM table2 WHERE id LIKE 'hallo' LIMIT 1
    */
    
      ?>


    p.s.
    fabos Lösung ist aber zu bevorzugen, hab's nur trotzdem gepostet damit Du siehst woran es knkret lag....
  6. Solltest du vorhaben, den Query wirklich so auszuführen (mit den Limits), wirds eh etwas kniffliger. Das hier könnte aber funktionieren:

    SELECT t1.id, 
           t1.name, 
           t1.special_id, 
           t2.id, 
           t2.inhalt 
    FROM   ((SELECT * 
            FROM   (SELECT * 
                    FROM   table1 
                    WHERE  category_id = ".$category."
                    LIMIT  0, 6) AS t1_sub) AS t1 
            LEFT JOIN (SELECT * 
                       FROM   (SELECT * 
                               FROM   table2) AS t2_sub) AS t2 
              ON t1.special_id = t2.id) 
    LIMIT  1;


    Warscheinlich ist das aber noch ausbaufähig =) Wobei ich hier mal davon ausgehe, dass category_id und id aus Zahlen bestehen. Dann wird das Hochkomma nämlich nicht benutzt.

    Beitrag zuletzt geändert: 27.4.2011 1:48:44 von fabo
  7. fabo schrieb:
    SELECT * FROM table1 LEFT JOIN table2 ON table1.special_id = table2.id WHERE table1.category_id LIKE '".$category."' GROUP BY table2.id


    Der Ansatz ist gut, hätte ich auch so gelöst.

    Bzw. das was er möchte, es fehlt lediglich das LIMIT 0,6 am Ende.

    Beim LEFT JOIN kommt ja logischerweise nur ein Datensatz mit, da auf die id gegroupt wird.
    Will man noch den neusten Datensatz im LEFT JOIN haben, dann kann man ja dementsprechend sortieren, zuerst auf die erste Tabelle und dann auf die zweite Tabelle.

    Beitrag zuletzt geändert: 27.4.2011 9:14:39 von sneppa
  8. Gruppierung ohne Aggregatfunktion ist aber eigentlich sinnfrei und wird AFAIK nur von MySQL zugelassen. Vielleicht erklärt der TE einmal genau, was er erreichen möchte, dann kann man sich Gedanken über ein entsprechendes SQL-Statement machen.
  9. e******n

    @simuliertes

    du verwendest
    $row[special_id]
    aber es kommt ganz dadrauf an ob, wenn er sein bissheriges weiter verwendet
    mysql_fetch_object
    oder
    mysql_fetch_array
    benutzt. Verwendet er mysql_fetch_object weiter, so wird deine methode mit array nicht funktionieren.
  10. excision schrieb:
    @simuliertes

    du verwendest
    $row[special_id]
    aber es kommt ganz dadrauf an ob, wenn er sein bissheriges weiter verwendet
    mysql_fetch_object
    oder
    mysql_fetch_array
    benutzt. Verwendet er mysql_fetch_object weiter, so wird deine methode mit array nicht funktionieren.

    :wall:
    Ja richtig. Mein Fehler, ich benutze üblicherweise fetch_array , habe das übersehen.
    *duckundweg*


  11. Autor dieses Themas

    squid

    Kostenloser Webspace von squid

    squid hat kostenlosen Webspace.

    Ich habe ehrlich gesagt noch nie etwas von der Funktion LEFT JOIN gehört, habe aber mal ein bisschen nachgeschaut. Damit sollte es funktionieren, trotzdem weiß ich noch nicht genau, wie es funktioniert (wie kann man z.B. mehrere LEFT JOINs in eine Abfrage einbauen?). Kennt sich damit jemand aus?

    MFG

    Beitrag zuletzt geändert: 27.4.2011 21:37:11 von squid
  12. Ein LEFT JOIN ist ein OUTER JOIN, d.h. Du bekommst auch dann eine Ergebnismenge, wenn in der hinzugejointen Tabelle keine passenden Einträge vorhanden sind. Die Felder dieser Tabelle enthalten dann NULL-Werte. Und natürlich kannst Du auch mehrere OUTER JOINS verwenden, sofern das sinnvoll ist. Aber vielleicht sagst Du uns einfach, was genau Du erreichen möchtest.
  13. Autor dieses Themas

    squid

    Kostenloser Webspace von squid

    squid hat kostenlosen Webspace.

    Bezwecken will ich damit: Es gibt eine Haupttabelle, in welcher Namen von Produkten und IDs von den Bestandteilen zu finden sind. Des weiteren gibt es noch einige anderen Tabellen, die die Produktbestandteile (inklusive zugehöriger ID) enthalten. Jedes Bestandteil hat also seine eigene Tabelle, und ein Script soll anhand der ersten Tabelle für jedes Produkt eine Beschreibung ausgeben, zu der auch die Beschreibungen zu den einzelnen Bestandteilen gehören, welche aber nur in den anderen Tabellen zu finden sind.

    Ich habe mal anhand des Beitrages von eagle275 (http://www.php.de/datenbanken/76493-mysql-left-join-query-aus-mehreren-tabellen.html, gefunden durch Google) folgendes versucht:

    $abfrage = "SELECT * FROM pcs ";
    $abfrage.= "LEFT JOIN cpu ON cpu.id = pcs.cpu_id";
    $abfrage.= "WHERE pcs.category_id LIKE '".$category."' LIMIT 6";
    
    	$ergebnis = mysql_query($abfrage);
    	while($row = mysql_fetch_object($ergebnis))
    		{
    		}


    Ausgabe:
    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\MyPages\Server\a\products\products_list.php on line 57

    (z.57 ist die WHILE Schleife)

    Habe ich irgendeinen Fehler im Code oder etwas grundsätzlich falsch gemacht?
    MFG

    Beitrag zuletzt geändert: 28.4.2011 13:10:27 von squid
  14. squid schrieb:
    $abfrage = "SELECT * FROM pcs ";
    $abfrage.= "LEFT JOIN cpu ON cpu.id = pcs.cpu_id";
    $abfrage.= "WHERE pcs.category_id LIKE '".$category."' LIMIT 6";
    
    	$ergebnis = mysql_query($abfrage);
    	while($row = mysql_fetch_object($ergebnis))
    		{
    		}

    Habe ich irgendeinen Fehler im Code oder etwas grundsätzlich falsch gemacht?
    MFG

    Das pcs.cpu_id ist mit dem WHERE zusammengeschrieben.


    $abfrage = "SELECT * FROM pcs ";
    $abfrage.= "LEFT JOIN cpu ON cpu.id = pcs.cpu_id ";
    $abfrage.= "WHERE pcs.category_id LIKE '".$category."' LIMIT 6";
    
    	$ergebnis = mysql_query($abfrage);
    	while($row = mysql_fetch_object($ergebnis))
    		{
    		}


    So sollte es eigentlich schon funktionieren
  15. Die Abfrage konnte nicht verarbeitet werden. Das dürfte daran liegen, dass vor dem WHERE kein Leerzeichen steht.

    [edit] *Grmpf* zu langsam [/edit]

    Beitrag zuletzt geändert: 28.4.2011 13:19:00 von deddyh
  16. Autor dieses Themas

    squid

    Kostenloser Webspace von squid

    squid hat kostenlosen Webspace.

    Huh, danke, hatte ich gar nicht gemerkt xD
    Jetzt scheints zu funktionieren, noch eine kleine Frage - Hier rufe ich ja Daten von zwei Tabellen ab, manche Spalten haben aber denselben namen. Wie mach ich das dann, $row->pcs.name klappt nicht...
  17. Du kannst auch Aliase vergeben.
    SELECT A.Feld1 AS Irgendwas, B.Feld1 AS EtwasAnders
    FROM Tabelle1 A
    JOIN Tabelle2 B ON B.Dings_ID = A.ID

    Das Feld aus Tabelle A kannst Du nun über Irgendwas ansprechen, das aus Tabelle B über EtwasAnders.
  18. Autor dieses Themas

    squid

    Kostenloser Webspace von squid

    squid hat kostenlosen Webspace.

    deddyh schrieb:
    Du kannst auch Aliase vergeben.
    SELECT A.Feld1 AS Irgendwas, B.Feld1 AS EtwasAnders
    FROM Tabelle1 A
    JOIN Tabelle2 B ON B.Dings_ID = A.ID

    Das Feld aus Tabelle A kannst Du nun über Irgendwas ansprechen, das aus Tabelle B über EtwasAnders.


    Jap, so klappts!
    Danke an alle und wünsche euch schöne Ferien!
  19. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!