kostenloser Webspace werbefrei: lima-city


mysql abfragen verschachteln?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    joi002

    Kostenloser Webspace von joi002

    joi002 hat kostenlosen Webspace.

    Hi,

    Kann man in einer Mysql-abfrage, eine weitere einbinden?
    Also ungefähr so:

    # ----
    if($result->num_rows) {
    	while($row = $result->fetch_assoc()) {
    		echo $row['Titel'];
    
    		$themen = 'SELECT ID
    			 FROM themen 
    			WHERE Kat = '.$row['Kat'];
    		$result3=$db->query($themen);
    		if(!$result3) {
    			echo $db->error;
    		}
    		$i=0;
    		if($result3->num_rows) {
    			while($row3 = $result3->fetch_assoc()) {
    				$i++;
    			}
    		}
    		echo 'Die Kategorie hat  '.$i.' Beiträge!';
    	}
    }


    Wenn es geht, warum funktioniert das oben dann bei mir nicht?

    Was mach ich falsch?

    Ich hoffe ihr könnt mir helfen!

    Glg Joi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. 1. Ist Kat ein String oder ein Interger? Wenn ersteres fehlen die Anführungszeichen
    2. Und wo ist die verschachtelte Abfrage?
  4. Autor dieses Themas

    joi002

    Kostenloser Webspace von joi002

    joi002 hat kostenlosen Webspace.

    Kat ist ein integer, aber das hab ich bereits behoben.

    es ist inder abfrage

    $select = 'SELECT ID,Kat,Titel,beschreibung,posts        // ERSTE ABFRAGE
    	FROM foren
    	ORDER BY ID DESC';
    
    $result=$db->query($select);
    if(!$result) {
    	echo $db->error;
    }
    if($result->num_rows) {
    	while($row = $result->fetch_assoc()) {
    		echo $row['Titel'];
    
    		$themen = 'SELECT ID            // 2.ABFRAGE
    			 FROM themen 
    			WHERE Kat = '.$row['Kat'];
    		$result3=$db->query($themen);
    		if(!$result3) {
    			echo $db->error;
    		}
    		$i=0;
    		if($result3->num_rows) {
    			while($row3 = $result3->fetch_assoc()) {
    				$i++;
    			}
    		}
    		echo 'Die Kategorie hat  '.$i.' Beiträge!';
    	}
    }


    ist das rein technisch her möglich?
  5. h*****b

    Falls du Abfragen über mehrere Tabellen meinst, das geht!

    Wie folgt (mal die letzten 10 Informatik-Stunden preisgeben ;)):

    SELECT Spalte1, Spalte2, Spalte3, ... FROM Tabelle1, Tabelle2 WHERE Tabelle1.Fremdschlüssel = Tabelle2.Primärschlüssel ORDER BY Spalte1


    Wobei folgendes gilt:
    -Die Tabellen brauchen als Engine InnoDB
    -Tabelle1.Fremdschlüssel = Tabelle2.Primärschlüssel heißt JOIN-Bedingung (kann man auch als INNER JOIN bei Google nachsehen (ist das gleiche))

    Das sollte alles sein. Die WHERE-Bedingung ist wichtig, damit nicht alle Einträge einer Tabelle mit jeweils jedem Eintrag der 2ten Tabelle kombiniert werden (Kreuzprodukt). InnoDB ist wichtig, um Fremdschlüssel einzutragen.

    Bei weiteren Fragen, melde dich.

    mfg
    htnipdb
  6. @htnipdb: Du solltest die Kompetenz deines Informatiklehrer etwas in Frage stellen.
    Allein aus zwei Gründen:
    1. Der explizite Fremdschlüssel und somit die Verwendung von InnoDb sind nicht nötig. Wenn man selbst auf Datenkonsistenz achtet, dann ist dasFestlegen eines Fremdschlüssels nicht unbedingt nötig. Es ist zwar ein Fremdschlüssel, die Datenbank muss aber nicht unbedingt etwas davon wissen.
    2. Kreuzprodukte sind böse. Man sollte sich nicht unbedingt auf den Anfrageoptimierer verlassen. In diesem Fall wird er dir das Kreuzprodukt in einem normalen join herausoptimieren, aber man sollte sich wie gesagt nicht darauf verlassen.
    Viel schöner wäre es, wenn du die Tabellen folgendermasen joinst:
    FROM table1 a [type] JOIN table2 b ON a.Hallo = b.Hi
    Das hat den Vorteil, dass kein vollständiges Kreuzprodukt gebildet werden muss, bevor deine Selektion ausgeführt wird. Wie gesagt, wird das der Anfragenoptimierer erkennen, aber man sollte sich nicht zu sehr auf den Automatismus verlassen...
  7. e********l

    -Die Tabellen brauchen als Engine InnoDB

    Nein, brauchen sie nicht.

    @topic: Du willst die Beiträge zählen? Nichts leichter als das.

    SELECT	f.ID, f.Kat, f.Titel, f.beschreibung, f.posts,
    	COUNT(t.ID) AS beitraege
    FROM	foren AS f
    	INNER JOIN	themen AS t
    		ON 	t.Kat = K.ID
    GROUP BY	t.kat, f.id
    ORDER BY	f.id DESC


    Wenn ich mich nicht gerade total verzettelt hab um diese Feierabends Uhrzeit, dann solltest du damit die Anzahl an Beiträgen mit einer Abfrage aller Themen in den jeweiligen Kategorien ermitteln können :)
  8. h*****b

    1. Ich stelle sie nicht in Frage. Aber ich denke, dass sie das ganze zum Zwecke der nicht in Informatik interessierten Schüler vereinfacht haben
    2. Das deckt sich vom Prinzip mit dem ersten, also dem Vereinfachen des Prozesses.

    Außerdem wollte ich es vereinfacht darstellen, um ihm nicht nur eine Lösung aufzuzeigen, mit der er evtl. sowieso nicht viel anfangen kann (er weiß halt nur, dass sie funktioniert), sondern eine Erklärung abliefern, damit er es für das nächste mal versteht.

    @evil-devil: Wenn du mit Fremdschlüssel arbeiten willst/musst, schon

    @nikic: Das ist kein Automatismus, dabei werden lediglich alle unsinnigen Einträge rausgefiltert.
  9. htnipdb schrieb:
    1. Ich stelle sie nicht in Frage. Aber ich denke, dass sie das ganze zum Zwecke der nicht in Informatik interessierten Schüler vereinfacht haben
    2. Das deckt sich vom Prinzip mit dem ersten, also dem Vereinfachen des Prozesses.

    Da hast du sicherlich Recht. Informatikunterricht an Schulen muss wohl auf etwas tieferem Niveau gehalten werden, damit man es möglichst einfach versteht. Meine Aussage über die Kompetenz deines Lehrers nehme ich zurück.

    @evil-devil: Wenn du mit Fremdschlüssel arbeiten willst/musst, schon

    Das ist leicht paradox. Wenn man sagst, dass man einen Fremdschlüssel benötigt geht man meistens davon aus, dass man ihn immer benötigt.

    @nikic: Das ist kein Automatismus, dabei werden lediglich alle unsinnigen Einträge rausgefiltert.

    Bei der internen Funktionsweise des Anfragenoptimierers kenne ich mich nicht aus. Ich weiß nur, dass er den schnellsten oder eher den Weg mit den wenigsten Datensätzen unterwegs versucht zu gehen. Und das wäre in diesem Fall natürlich das Herausoptimieren zu einem echten Join.

    mfg nikic und gute Nacht :) I'm sleepy :sleep:
  10. e********l

    htnipdb schrieb:
    @evil-devil: Wenn du mit Fremdschlüssel arbeiten willst/musst, schon

    Nein, muss ich nicht. Was du meinst ist Referenzielle Intigrität, wie sie unter MS Access und seit einiger Zeit auch bei MySQL vorkommt.
    Man assoziert die Fremd- und Primärschlüssel und die Datenbank sorgt dafür, dass man nicht einfach einen referenzierten Datensatz löschen darf oder hinzufügen kann ohne andere Werte entsprechend mit anzupassen. In einer Datenbank Anwendung ist es aber in aller Regel der Fall, dass man diese Wege zu Fuß beschreitet und sich selbst darüm kümmert. Das ist vor allem dann der Fall, wenn man nicht mehr einfache Schlüssel hat.

    Ich weiß nicht ob dir zusammen gesetzte Schlüssel was sagen, aber mit Referenzieller Intigrität kommt man da nicht weit. Man muss sich da schon selbst um alles kümmern.

    Der wirkliche Vorteil von InnoDB ist, dass Transaktionen unterstützt werden. Wenn ich also einen Datenfehler habe, kann ich meine Änderungen rückgängig machen. Allerdings kommt dies auf Kosten der Performance und man muss abwägen ob man wirklich Transaktions sichere Tabellen benötigt oder nicht.
  11. 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!