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:

[email protected]

Erfahrenes Mitglied
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 ;)
 

abakuz

Mitglied
Hallo [email protected], 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:

[email protected]

Erfahrenes Mitglied
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!
 

abakuz

Mitglied
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:

abakuz

Mitglied
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....
 

nero_85

Erfahrenes Mitglied
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!
 

abakuz

Mitglied
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..... :)
 

abakuz

Mitglied
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.
 

[email protected]

Erfahrenes Mitglied
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
 

abakuz

Mitglied
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


Array-of-Arrays...*grummel*.... :) .., na da weiss ich ja jetzt wonach ich suchen muss, wobei mir der erste Teil Deiner Beschreibung einfacher erscheint....:)

// Edith: heute morgen läuft das mit den logishen zusammenhängen bei mir noch nicht so gut
Das ist heute bei mir auch nach 3 Kaffee noch nicht besser geworden... :)



Vielen Dank erstmal, ich werde beide Möglichkeiten ausprobieren.
 

abakuz

Mitglied
@[email protected]: ist zwar nicht die eleganteste Lösung und ganz simpel, aber ich denke so meintest Du es....

PHP:
$result  = mysql_query("SELECT c_quest FROM content WHERE ct_id = $id")or die(mysql_error());
$result1 = mysql_query("SELECT c_answ FROM content WHERE ct_id = $id") or die(mysql_error());

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

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

Ergebnis:
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


das mit dem "array in arrays" will ich auch noch probieren, aber irgendwie schnall ich
das im Moment noch nicht....


EDIT: Übrigens hatte @nero_85 die Lösung vorgeschlagen, hatte blos vergessen zwei results ($result,result1)) zu machen....thx auch an nero_85 nochmal... ;)
 
Zuletzt bearbeitet:

nero_85

Erfahrenes Mitglied
Das ist genau das Selbe wie das was ich vorschlug! Nur umständlicher! Bei mir funktioniert das von mir vorgeschlagene Script nämlich!
 

abakuz

Mitglied
Du warst jetzt ca. 10 Sec. schneller....*gg*., genau das hab ich grad festgestellt.....;)

EDIT: Wieso umständlicher, ich find das ist so wie Du es vorgeschlagen hast....nur das bei Deinem Vorschlag nur ein result vorkam und nicht $result u. $result1.
Ich habe angenommen das der Fehler darin lag.

EDIT:EDIT: Wie soll denn Deine Variante funktionieren, ohne zwei verschiedene $results......
....nu versteh ich nix mehr....total --> :confused:

Wie meinstest Du es denn nero :confused:
 
Zuletzt bearbeitet:

Forum-Statistiken

Themen
272.356
Beiträge
1.558.615
Mitglieder
187.832
Neuestes Mitglied
SirrDansen