Datenbankausgabe aus mehreren Tabellen?!

ribasa

Grünschnabel
Hallo,

aktuell arbeite ich daran, eine "Produktliste" aus einer MySQL Datenbank ausgeben zu lassen. Das funktioniert auch alles! Vorher habe ich das über HTML einfach gemacht.. jetzt über PHP MySQLi - hier mal der Code:

PHP:
// Datenbankverbindung..
$verbindung = mysqli_connect(HOST, USER, PASSWORT, DATENBANK);
mysqli_query($verbindung,"SET NAMES 'utf8'");

$sql = "SELECT * FROM produkte";
$result = mysqli_query($verbindung, $sql);

while($zeile = mysqli_fetch_object($result))
{
	echo $zeile->artikel;
        echo $zeile->artikelinfo;
        echo $zeile->preis .' €';
}

mysqli_close($verbindung);
?>

Tabelle 'produkte' sieht so aus: id, artikel, artikelinfo, preis, artikelgruppe
Zudem habe ich noch eine Tabelle 'artikelgruppen': artikelgruppe (INT, Auto Increment, Primärschlüssel) und Gruppenname


Nun möchte ich die Produkte aber nach der Artikelgruppe sortiert ausgeben! Bedeutet: Es soll nicht die Zahl aus der Tabelle Produkte zum Datensatz ausgegeben werden, sondern immer über dem ersten Datensatz jeder Artikelgruppe deren Überschrift (aus 'Gruppenname') stehen.


Beispiel:

Mobilgeräte (ist die Überschrift der Artikelgruppe)
Datensatz 1
Datensatz 2 usw.. die zu dieser Artikelgruppe gehören

E-Books
Datensatz 1
Datensatz 2
Datensatz 3 usw. .....

Zudem soll es aber gleichzeitig möglich sein, nur eine bestimmte Anzahl Datensätze pro Seite anzuzeigen (z. B. 10), also möchte ich noch eine Pagination einfügen können... (diese mache ich dann selbst - hier geht es nur um das erste Problem)

Habe dazu auch schon gegoogelt usw. aber irgendwie nicht so wirklich was gefunden.. vielleicht habe ich auch einfach falsch gesucht oder stehe gerade einfach auf'm Schlauch!

Daher die Frage, geht das so überhaupt und wenn ja, wie?
Danke schonmal für hilfreiche Antworten!
 
Also verstehe ich das richtig?

Du willst aus der Tabelle "Artikelgruppe" Den namen der Artikelgruppe raussuchen und danach aus der anderen Tabelle alle Artikel raussuchen die zu dieser Artikelgruppe gehören?

Würde mir spontan jetzt nur folgendes einfallen:

PHP:
$abfrage1 = mysql_query("SELECT * FROM artikelgruppe");
$ergebnis = mysql_fetch_array($abfrage1);
$abfrage2 = mysql_query("SELECT * FROM produkte WHERE artikelgruppe = $ergebnis1->artikelgruppe[1]");

echo "Überschrift: <b>$ergebnis1->Artikelgruppe</b><br />";
while($row = mysql_fetch_object($abfrage2))
	{
	if($row->artikelgruppe == $ergebnis->artikelgruppe)
		{
		echo $row->artikel;
		}
	}

bei abfrage1 werden halt alle daten aus der tabelle gepackt und dann in ein array gehauen, durch das array kannst du gezielt die artikelgruppe auswählen oder du musst bei abfrage 1 noch "WHERE artikelgruppe = "bla" hinzufügen und ergebnis in fetch_object ändern. und die [1] weg.

Irgendwie so sollte es jedenfalls gehen ^^ habs jetzt selber nicht ausprobiert aber rein theoretisch.

So wird halt erst der Gruppenname genannt (musst die Variablen halt selber anpassen) und darunter werden alle Artikel aufgelistet, die zu dieser Gruppe gehören.

Wichtig ist letztendlich nur der Vergleich in der IF Anweisung, du musst ihm halt sagen WENN der Eintrag mit der Artikelgruppe übereinstimmt dann mach ein ECHO xD
 
Zuletzt bearbeitet:
Hi ribasa,
es ist unschön das über zwei SQL-Abfragen zu lösen. Du kannst auch bereits mit MySQL-Code die beiden Tabellen kompinieren. Dafür gibt es JOIN-Befehele. Dazu kannst du dir hier mal was durchlesen.
Dein SQL-Befehl sollte dann ungefähr so aussehen:
PHP:
SELECT * FROM `produkte` LEFT JOIN `artikelgruppe` ON (produkte.`artikelgruppe` = artikelgruppe.`id`) ORDER BY artikelgruppe.`name` ASC

Jetzt hast du die beiden Tabllen sozusagen zusammengefügt und hinter jedem Artikel stehen noch die dazugehörigen Informationen der Artikelgruppe.

In PHP kannst du jetzt durch das Array durchgehen und abfragen ob die Artikelgruppe des aktuellen Artikels eine andere ist als die davor. Wenn ja gibst du die Artikelgruppe als Überschrift aus, sonst nur die Artikelinformationen.

Gruß,
Marco
 
Am saubersten ist es, die Daten einmal auslesen und sauber in eine Array-Struktur bringen. Diese kann dann gemütlich in eine HTML-Struktur gebracht werden.

Wie immer ungetestet
PHP:
$sql = <<<SQL

SELECT 
    p.id, 
    p.artikel, 
    p.artikelinfo, 
    p.preis, 
    p.artikelgruppe,
    ag.gruppenname 
FROM 
    produkte AS p 
    LEFT JOIN artikelgruppen AS ag 
        ON p.artikelgruppe = ag.`id`
ORDER BY 
    ag.`name`,
    p.artikel
SQL;

$result = mysql_query($sql);

//Array initialisieren
$data = array();
//Daten auswerten
while($row = mysql_fetch_assoc($result)){
    //Pro Artikelgruppe den Namen setzen
    $data[$row[artikelgruppe]]['name'] = $row['gruppenname'];
    //und die Details
    $data[$row[artikelgruppe]]['details'][] = $row;
}

//Ausgaben der Daten
foreach($data as $group){
    //Gruppentitel ausgeben
    echo "<h1>{$group['name']}</h1>\n";
    //Artikel und Preis als Tabelle ausgeben.
    echo "<table>\n";
    //Titelzeile
    echo "<tr><th>Artikel</th><th>Preis</th></tr>";
    //Alle Detailzeilen
    foreach($group['details'] as $detail){
        echo "<tr><td>{$detail['artikel']}</td><td>{$detail['preis']}</td></tr>\n";
    }
    echo "</table>\n";
}
 
Danke schonmal für die Antworten! Werde das später noch ausführlicher testen, da ich gerade noch in der Uni sitze...

bei den letzten beiden Varianten / Posts hier, bekomme ich immer folgende Fehlermeldung:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /..../htdocs/.............../testausgabue.php on line 22

habe eigentlich alles so übernommen und finde da keinen Fehler. Aber werde mir das heute Nachmittag nochmal angucken!
 
Zeig mal dein SQL dass du an die DB schickst. Un dprüfe es mittels phpMyAdmin direkt gegen die Datenbank.
 
Zurück