mysql einträge durch id grupieren

gást

Grünschnabel
hallo,

ich habe zwei tabellen die mit join verknüpft sind, und die einträge sollen in kategorien aufgeteilt werden.

hier mein code:
Code:
<?php
$sql2 = "SELECT * FROM tabelle_cat LEFT JOIN eintreage ON cat_id = eintrag_id GROUP BY cat_id";

//Zeilen aus forum_cat Tabelle auslesen
$result2 = mysql_query($sql2);
?>
<?
while ($rows2 = mysql_fetch_array($result2))
{
?>

funktioniert eig soweit aber es werden nur der erste eintrag angezeigt.

Kategorie 1
- Eintrag 1

Kategorie 2
- Eintrag 1

es soll aber so aussehen:

Kategorie 1
- Eintrag A1
- Eintrag A2
...

Kategorie 2
- Eintrag B1
- Eintrag B2
...

danke im vorraus
 
Du brauchst in der Tabelle einträge ein Feld "cat_id", das du für den join nehmen musst. Sonst kann man wenig sagen, ohne deine Tabellenstruktur zu kennen.
 
SQL:
SELECT * FROM tabelle_cat LEFT JOIN eintreage ON cat_id = eintrag_id GROUP BY cat_id

Item 1: SELECT * FROM sollte man NIE brauchen! Besonders nicht bei Webapplikationen. Gib immer genau an was du haben willst im SELECT-Teil aka Make the Implicit Explicit.

Item 2: Arbeite mit Tabellen-Alisases, dann ist immer klar woher ein Attribut stammt.

Item 3: Warum GROUP BY wenn du keine Aggregatsfunktion verwendest? Weg damit!

Dann sollte das ganze dann ca. so aussehen (ich habe nun mal einfach angenommen die Felder die du haben willst heissen e.name und c.code. Pass das einfach an so wie es bei dir heisst):
SQL:
SELECT e.name, c.code FROM tabelle_cat c LEFT JOIN eintreage e ON c.cat_id = e.eintrag_id;

Ach ja: und natürlich stimmt was Anna Bolika schreibt. c.cat_id und e.eintrag_id müssen natürlich tatsächlich eine Verknüpfung der Tabellen darstellen. Sieht für mich vom naming her eher wie zwei PK's aus.... Und nicht wie PK und FK.... aber das musst du uns sagen. Rein theoretisch ist es schon möglich dass die Dinge so heissen, auch wenn es nicht besonders sinnvoll wäre.
 
Zuletzt bearbeitet von einem Moderator:
hallo vielen dank für die schnellen antworten,

ich habe mal eben die beiden tabellen als bild angehängt.

@BaseBallBatBoy
habs geändert und es wird genau so wie vorher kategorie doppelt angezeigt. habe ein bild angehängt wie es jetz aussieht, und wie es am ende aussehen soll wenn das überhaupt so möglich ist.

und hier mal der neue code:
Code:
<?php
$sql = "SELECT e.name, c.cat_name FROM tabelle_cat c LEFT JOIN eintreage e ON c.cat_id = e.eintrag_id";
 
$result = mysql_query($sql);

while ($rows = mysql_fetch_array($result))
{
?>
<table border = "1">
<tr>
<td><? echo $rows['cat_name'];?></td>
</tr>
<tr>
<td><? echo $rows['name'];?></td>
</tr>
</table>
<br>
<?php
}
?>
 

Anhänge

  • eintreage.jpg
    eintreage.jpg
    32,8 KB · Aufrufe: 10
  • tabelle_cat.jpg
    tabelle_cat.jpg
    17,3 KB · Aufrufe: 7
  • tabelle.png
    tabelle.png
    8,6 KB · Aufrufe: 9
  • ergebnis.jpg
    ergebnis.jpg
    23 KB · Aufrufe: 7
Das Ergebnis deiner Query ist absolut richtig (ps: left join ist überflüssig, mach inner join draus).
Du gibts ZWEI Spalten aus. Willst aber in der Darstellung EINE daraus machen. Folglich musst du dafür sorgen dass innerhalb eines Records sämtliche Informationen der Kategorie enthalten sind, weil ja dann schon der nächste Record eine andere Kategorie darstellt.

Das hier wäre eine Variante:
SQL:
SELECT c.cat_name, GROUP_CONCAT(e.name SEPARATOR ', ') AS name
FROM tabelle_cat c 
INNER JOIN eintreage e 
ON c.cat_id = e.eintrag_id
GROUP BY c.cat_name;

Tipp: Als SEPARATOR kann man z.B. auch <br> verwenden.

Oder aber du gibst wirklich alles als eine Spalte aus:
SQL:
SELECT cat_name AS name FROM tabelle_cat WHERE cat_id = 1
UNION ALL
SELECT name FROM eintreage WHERE eintrag_id = 1
UNION ALL
SELECT cat_name AS name FROM tabelle_cat WHERE cat_id = 2
UNION ALL
SELECT name FROM eintreage WHERE eintrag_id = 2;

Das ist aber unflexibel, weil du dann das für jede einzelne Kategorie so machen musst.

Oder aber du löst das ganze per PHP Code mit deinem ersten SQL, indem du über das Result Set loopst.
In einer Hilfsvariable speicherst du dann immer die vorherige Kategorie. Wenn die gleich ist einfach wieder den namen ausgeben, ansonsten gibst du die Kategorie und den namen gleich aus.
 
Zuletzt bearbeitet von einem Moderator:
danke für die hilfe, jetz wird es so angezeigt wie es soll! ich hab mich für die erste variante mit den separator entschieden. auch ein danke an die anderen die hier geantwortet haben.

EDIT:

ich habe nun das problem das eine beschreibung dadrunter angezeigt werden soll, aber es wird nur die erste angezeigt :(

Code:
<?
$sql2 = "SELECT c.cat_name, description, GROUP_CONCAT(e.name SEPARATOR '<br> ') AS name FROM tabelle_cat c INNER JOIN eintreage e ON c.cat_id = e.eintrag_id GROUP BY c.cat_name";

//Zeilen aus forum_cat Tabelle auslesen
$result2 = mysql_query($sql2);

//Schleife starten
while ($rows2 = mysql_fetch_array($result2))
{
?>
<table border="1" cellpadding="2" cellspacing="0" width="710px">
          <tr>
            <th colspan="2" bgcolor="grey"><? echo $rows2['cat_name']; ?></th>
          </tr>
          <tr>
            <td style="padding:5px;" bgcolor="#CCCCCC"><? echo $rows2['name']; ?><br><? echo $rows2['description']; ?></td>
          </tr>
        </table>
<?
} //Schleife beenden
?>
 

Anhänge

  • ergebnis.png
    ergebnis.png
    3,3 KB · Aufrufe: 9
Zuletzt bearbeitet:
SQL:
SELECT 
  c.cat_name, 
  description, 
  GROUP_CONCAT(e.name SEPARATOR '<br>') AS name 
FROM 
  tabelle_cat c 
INNER JOIN 
  eintreage e 
ON 
  c.cat_id = e.eintrag_id 
GROUP BY 
  c.cat_name;

Item 1: Ich würde dir empfehlen auch SQL Queries zu formatieren. Macht das Leben für alle einfacher:
http://www.tutorials.de/content/1550-php-sql-statement-php-lesbar-darstellen.html

Item 2: Woher stammt denn nun description? Das gab es vorhin noch nicht. Die Tabellen-Alisases c und e haben den Zweck genau anzugeben woher ein Attribut stammt (=übersichtlicher). Also mach doch auch gebrauch davon. Ich kann so nicht sagen von welcher Tabelle das Feld stammt...

Item 3: Offenbar hast du noch nicht verstanden wie GROUP BY funktioniert. description muss da natürlich auch mit rein wenn es nicht Teil einer Aggregatsfunktion ist (oder aber du machst mit description das gleiche wie mit e.name, wenn es auch aus eintreage stammt?). Ich würde dir sehr empfehlen diese grundlegenden Konzepte mal genauer anzuschauen:
http://www.w3resource.com/sql/group-by.php
http://www.tizag.com/sqlTutorial/sqlgroupby.php
 
Zuletzt bearbeitet von einem Moderator:
Zurück