Zwei SQL-Querys - aus einer Tabelle - zusammen fassen

abakuz

Mitglied
Hallo,

ich habe folgendes Problem:
ich möchte zwei Querys aus einer DB-Tabelle zusammen fassen.

Der Tabellenkopf ist so aufgebaut:

--------------------------------------
| id |ct_id | c_quest | c_answ |
--------------------------------------

Folgendes habe ich probiert:

PHP:
require("inc/db_connect.inc.php");

 1: $id="7";
 2: 
 3: 
 4: $sqls = array("SELECT c_quest FROM content WHERE ct_id = $id", "SELECT  c_answ FROM content WHERE ct_id = $id");
 5:
 6:     foreach($sqls as $sql) {
 7:        $result = mysql_query($sql) or die(mysql_error());
 8:     }
 9:
10: echo "Frage/Antwort aus DB:<br />\n";
11:    while($row = mysql_fetch_assoc($result)) {
12:        echo $row['c_quest'];
13:        echo $row['c_answ'] ."<br />";
14:    }

Ergebnis: (Notice: Undefined index: on line 12)
Code:
Frage/Antwort aus DB:

Notice: Undefined index: c_quest in C:\Apache\Apache2\htdocs\SQL-Uebungen\test.php on line 12
Antwort1, Antwort1, Antwort1,Antwort1, Antwort1, Antwort1,Antwort1, Antwort1, Antwort1,
Antwort1, Antwort1, Antwort1,Antwort1, Antwort1, Antwort1,
Antwort1, Antwort1, Antwort1

Notice: Undefined index: c_quest in C:\Apache\Apache2\htdocs\SQL-Uebungen\test.php on line 12
Antwort2, Antwort2, Antwort2,Antwort2, Antwort2, Antwort2,Antwort2, Antwort2, Antwort2,
Antwort2, Antwort2, Antwort2,Antwort2, Antwort2, Antwort2,
Antwort2, Antwort2, Antwort2,

Notice: Undefined index: c_quest in C:\Apache\Apache2\htdocs\SQL-Uebungen\test.php on line 12
Antwort3, Antwort3, Antwort3,Antwort3, Antwort3, Antwort3,Antwort3, Antwort3, Antwort3,
Antwort3, Antwort3, Antwort3,Antwort3, Antwort3, Antwort3,
Antwort3, Antwort3, Antwort3,

...etc..

Diesen Lösungsansatz habe ich von dieser Seite:
http://tut.php-q.net/mysql-query.html

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

Nun habe ich den Code geändert, und es funktioniert.
Aber der Code sieht schrecklich "klotzig" aus:

PHP:
require("inc/db_connect.inc.php");

$id="7";

//Mehrere Abfragen gleichzeitig
$frag = ("SELECT c_quest FROM content WHERE ct_id = $id");
$antw = ("SELECT c_answ FROM content WHERE ct_id = $id");

$frage = mysql_query($frag) or
              die("<b>Query:------> </b> ".$frag."<br>".
                  "<b>Q-Antwort:--> </b>".mysql_error());

$antwort = mysql_query($antw) or
              die("<b>Query:------> </b> ".$antw."<br>".
                  "<b>Q-Antwort:--> </b>".mysql_error());


	echo "<b>Frage/Antwort aus der DB:<br /><br /></b>";

	while($row = mysql_fetch_assoc($frage)) {
		echo $row['c_quest']."<br />\n";
	}
	
	echo "<br /><br /><br />";
	
	while($row = mysql_fetch_assoc($antwort)) {
		echo $row['c_answ']."<p />\n";
	}

Ergebnis: (das ist auch mein Zielformat: oben die Fragen, unten die Antworten...)
Code:
Frage/Antwort aus DB:

Frage 1
Frage 2
Frage 3

Antwort1, Antwort1, Antwort1,Antwort1, Antwort1, Antwort1,Antwort1, Antwort1, Antwort1,
Antwort1, Antwort1, Antwort1,Antwort1, Antwort1, Antwort1,
Antwort1, Antwort1, Antwort1

Antwort2, Antwort2, Antwort2,Antwort2, Antwort2, Antwort2,Antwort2, Antwort2, Antwort2,
Antwort2, Antwort2, Antwort2,Antwort2, Antwort2, Antwort2,
Antwort2, Antwort2, Antwort2,

Antwort3, Antwort3, Antwort3,Antwort3, Antwort3, Antwort3,Antwort3, Antwort3, Antwort3,
Antwort3, Antwort3, Antwort3,Antwort3, Antwort3, Antwort3,
Antwort3, Antwort3, Antwort3,
...etc..

1. Warum bekomm ich im ersten Beispiel immer den Fehler "Undefined Index"?
2. Wie könnte ich die Abfrage aus dem unteren Beispiel eleganter lösen?




Gruß abakuz
 
Zuletzt bearbeitet:
Also entweder ich hab was total missverstanden, oder du hast noch nicht soviel Ahnung von SQL und MySQL ;)

Code:
SELECT c_quest, c_answ FROM content WHERE ct_id = $id
Liefert dir beider Felder auf einen schlag zurück.

Und die Fehlermeldung beruht wohl schlicht darauf, weil du zunächst in $result das ergebniss des SQL-Queries "SELECT c_quest FROM content WHERE ct_id = $id" holst. Danach überschreibst du dann aber $resulst wieder neu mit dem Ergebnis des Queries "SELECT c_answ FROM content WHERE ct_id = $id".

Folglich steht nach dem Foreach nur das Ergebnis des 2. Queries in $result. Wenn du jetzt dir die Zeilen als assoziatives-Array von $result holst, bekommst du folglich auch nur die Reihen zurück, die du auch ausgewählt hast.

Und da du im 2. Statement eben nur c_answ holst und nicht c_quest ist c_quest auch nicht im assoziativen-Array drin. Folglich erfolgt ein Zugriff auf einen Index der gar nicht vorhanden ist.

So erklär ich mir das zumindest mal ;)
 
Hallo GH@NDI, danke erstmal für Deine schnelle Antwort.

Also entweder ich hab was total missverstanden, oder du hast noch nicht soviel Ahnung von SQL und MySQL ;)
Da hast Du wohl recht, hab im Moment wirklich nicht viel Ahnung.... ^^

Liefert dir beider Felder auf einen schlag zurück.

Und die Fehlermeldung beruht wohl schlicht darauf, weil du zunächst in $result das ergebniss des SQL-Queries "SELECT c_quest FROM content WHERE ct_id = $id" holst. Danach überschreibst du dann aber $resulst wieder neu mit dem Ergebnis des Queries "SELECT c_answ FROM content WHERE ct_id = $id".

Folglich steht nach dem Foreach nur das Ergebnis des 2. Queries in $result. Wenn du jetzt dir die Zeilen als assoziatives-Array von $result holst, bekommst du folglich auch nur die Reihen zurück, die du auch ausgewählt hast.

Und da du im 2. Statement eben nur c_answ holst und nicht c_quest ist c_quest auch nicht im assoziativen-Array drin. Folglich erfolgt ein Zugriff auf einen Index der gar nicht vorhanden ist.

Ahaaaa.... nun leuchtet es mir ein, ich kann Deine Analyse auch auch gut nachvollziehen ......:)
Wenn Du mir jetzt noch sagen würdest wie ich es eleganter lösen könnte, würdest Du Deinem Namen "alle Ehre machen"....*gg*....
Hast Du einen Lösungsansatzt für mich?


Gruß abakuz
 
Zuletzt bearbeitet:
Also gut :)

Zunächst verwenden wir das optimierte SQL-Statement.
Code:
SELECT c_quest, c_answ FROM content WHERE ct_id = $id
Mit diesem Statement holen wir auf einen rutsch gleich c_quest und c_answ aus der Zeile, in der ct_id gleich $id ist.

Jetzt führen wir das Statement ganz normal aus, nur eben nur einmal und nicht mehrfach in einer Schleife.
Code:
$result = mysql_query($sql) or die(mysql_error());

Danach gehts wie gehabt weiter. :)

Code:
echo "Frage/Antwort aus DB:<br />\n"; 
while($row = mysql_fetch_assoc($result)) { 
        echo $row['c_quest']; 
        echo $row['c_answ'] ."<br />"; 
}

Jo, das dürfte es eigentlich auch schon gewesen sein ;)

Viel Spaß noch!
 
Suuuuuper, es funktioniert........ :) :)
So schaut es jetzt aus:

PHP:
require("inc/db_connect.inc.php");

$id="7";

//Mehrere Abfragen gleichzeitig

$sql = ("SELECT c_quest, c_answ FROM content WHERE ct_id = $id");

$result = mysql_query($sql) or die(mysql_error());

echo "Frage/Antwort aus DB:<br />\n"; 
while($row = mysql_fetch_assoc($result)) { 
        echo $row['c_quest']."<br />";  
        echo $row['c_answ']."<br /><br />"; 
}

Ergebnis:
Code:
1.Frage
Antwort1,Antwort1,Antwort1,Antwort1,Antwort1,Antwort1,
Antwort1,Antwort1,Antwort1,Antwort1,Antwort1,Antwort1,

2.Frage
Antwort2,Antwort2,Antwort2,Antwort2,Antwort2,Antwort2,
Antwort2,Antwort2,Antwort2,Antwort2,Antwort2,Antwort2,

....etc...

Nun habe ich noch die letzte Frage.
Wenn ich es nun so haben möchte wie bereits beschrieben:

Code:
1.Frage
2.Frage
3.Frage

Antwort1,Antwort1,Antwort1,Antwort1,Antwort1,Antwort1,Antwort1
Antwort2,Antwort2,Antwort2,Antwort2,Antwort2,Antwort2,Antwort2
Antwort3,Antwort3,Antwort3,Antwort3,Antwort3,Antwort3,Antwort3

Muss ich nun die Querys und die while-Schleife wieder "zerpflücken", oder
kann ich anhand der vorhandenen Query diese Formatierung darstellen?

Edit: vielleicht war die letze Frage ein bisschen schwammig gestellt.
mal anders gefragt....: :)
Würdest Du mir noch zeigen wie man das macht?

vielen Dank für Deine Hilfe! :)


Gruß abakuz
 
Zuletzt bearbeitet:
kann mir denn niemand sagen wie man eine Tabelle Spaltenweise ausliest und nacheinander darstellt....?!

Hab bereits 3 Kaffee und bin immer noch auf der Suche.
Mein Hauptproblem ist, dass ich noch nich sehr viel Erfahrung mit mysql/php habe.

z.b. weiss ich nicht welche Funktion ich dafür benutzen soll:

mysql_fetch_array
mysql_fetch_assoc
mysql_fetch_field
mysql_fetch_row
......usw...das sind sooooo viele..... :confused:

mit welcher Funktion kann ich denn sowas machen...bin auch fleissig am lesen auf php.net, ist also nicht so das ich einfach nur auf eine Lösung warte......
Please heeelp....
 
Ich würde aus der einen Schleife 2 machen:

PHP:
while($row = mysql_fetch_assoc($result)) {  
        echo $row['c_quest']."<br />";   
}  
echo "<br />";
while($row = mysql_fetch_assoc($result)) {    
        echo $row['c_answ']."<br /><br />";  
}

Wenns ne bessere Möglichkeit gibt, sagt bitte bescheid!
 
nero_85 hat gesagt.:
Ich würde aus der einen Schleife 2 machen:

PHP:
while($row = mysql_fetch_assoc($result)) {  
        echo $row['c_quest']."<br />";   
}  
echo "<br />";
while($row = mysql_fetch_assoc($result)) {    
        echo $row['c_answ']."<br /><br />";  
}

Wenns ne bessere Möglichkeit gibt, sagt bitte bescheid!

Leider gibt er dann nur den ersten Teil aus. Die untere While-Schleife scheint er nicht auszuführen....es erscheint auch kein Fehler-Code.


ich hatte es auch mal anders ausprobiert, aber da gibt er mir wieder Zeilenweise aus...
Aber ich möchte es doch Spaltenweise.....ich krieg ne Krise....hier der Code:
PHP:
while ($erg = mysql_fetch_row ($result))
{
for ($i = 0; $i < mysql_num_fields($result); $i++)
echo $erg[$i]."<br /><br />";
}

thx für Deinen Vorschlag..... :)
 
will ja echt nicht nerven......
aaaber....kann mir denn keiner helfen?

Bitte keine Antworten wie ---> :google:
Google ist mein bester Freund.... ^^
....der konnte mir leider auch nicht helfen.
 
Hallo!

Bei der Aufgabenstellung machste entweder wieder 2 queries. Und holst dann im ersten nur die zu stellenden Fragen und gibst diese dann aus.

Danach holst du dir die Antworten zu den gestellten Fragen und gibts diese dann aus.

Die "fortgeschrittene" Lösung wäre das ganze in eine Array-of-Arrays Lösung.
Da wäre z.B. denkbar, dass man auf die Frage mit $array[0][1] zugreifen kann und alle Antworten auf die Frage kommen dann von $array[0][0] bis $array[0][count($array[0])-1].

// Edith: heute morgen läuft das mit den logishen zusammenhängen bei mir noch nicht so gut :D
 

Neue Beiträge

Zurück