Anzahl der Einträge in der Verknüfungstabelle

Ich suche schon lange nach der Lösung, finden tu ich sie hoffenltich hier.

Mal die Ausgangssitutation:

Ich hab drei Tabellen:

Tabelle 1 (Einträge)

|id\_eintrag|name|datum|fid\_land|

Tabelle 2 (Länder)

|id\_land|name|stadt|

Tabelle 3 (Kommentare)

|id\_kommentare|kommentar|datum|fid\_eintrag|

In den Feldern ‚fid_land‘ und ‚fid_eintrag‘ stehen die ids zu den einträgen in Tabelle ‚Länder‘ bzw. ‚Einträge‘ (also eine 1:m Verknüpfung)

Ich möchte jetzt EINE Abfrage, die mir den Eintrag mit der id ‚X‘ mit einer Spalte ‚land‘ (hier ist das Feld ‚name‘ aus Tabelle 2) und eine Spalte mit ‚kommentare‘ (hier soll die Anzahl der Kommentare - aus Tabelle 3 - die bei ‚fid_eintrag‘ die id ‚X‘ haben) zurückgibt.

Als Ergebniss erwarte ich in etwa sowas:

|id\_eintrag |name |datum |fid\_land |land |kommentare |
+-----------+----------+---------+---------+--------+-----------+
| 1 |Der Name |1.2.2009 | 2 |Schweiz | 4 |
| 2 |Der Name2 |2.2.2009 | 1 |Schweiz | 2 |

Mein bisheriges Statement sieht so aus:

SELECT eintrag.\*, land.name AS land, COUNT(\*) AS kommentare 
FROM eintrag JOIN land ON land.id\_land = eintrag.fid\_land 
JOIN kommentare ON kommentare.fid\_eintrag = eintrag.id\_eintrag 
GROUP BY kommentare.id\_kommentare

Die Anzahl bei den Kommentaren stimmt aber nicht.

Bitte helft mir und erklärt mir auch, was hier nicht stimmt!

Vielen Dank im Voraus!
Xaver


Hier hab ich mal den SQL DUMP der drei Tabellen:

CREATE TABLE `eintrag` (
 `id_eintrag` int(11) NOT NULL auto\_increment,
 `name` varchar(250) collate utf8\_unicode\_ci NOT NULL default '',
 `datum` date NOT NULL default '0000-00-00',
 `fid_land` int(11) NOT NULL default '0',
 PRIMARY KEY (`id_eintrag`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8\_unicode\_ci AUTO\_INCREMENT=4 ;

INSERT INTO `eintrag` (`id_eintrag`, `name`, `datum`, `fid_land`) VALUES
(1, 'Hallo 1. Eintrag', '2009-10-12', 1),
(2, 'Hallo Welt noch ein Eintrag', '2009-10-13', 2),
(3, 'Hallo 3. Eintrag', '2009-10-12', 2);

CREATE TABLE `kommentare` (
 `id_kommentare` int(11) NOT NULL auto\_increment,
 `text` varchar(250) collate utf8\_unicode\_ci NOT NULL default '',
 `datum` date NOT NULL default '0000-00-00',
 `fid_eintrag` int(11) NOT NULL default '0',
 PRIMARY KEY (`id_kommentare`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8\_unicode\_ci AUTO\_INCREMENT=8 ;

INSERT INTO `kommentare` (`id_kommentare`, `text`, `datum`, `fid_eintrag`) VALUES
(1, 'Kommentar 1', '2009-10-12', 1),
(2, 'Kommentar 2', '2009-10-12', 1),
(3, 'Kommentar 3', '2009-10-12', 1),
(4, 'Kommentar 4', '2009-10-12', 2),
(5, 'Kommentar 5', '2009-10-12', 3),
(6, 'Kommentar 6', '2009-10-12', 3),
(7, 'Kommentar 7', '2009-10-12', 3);

CREATE TABLE `land` (
 `id_land` int(11) NOT NULL auto\_increment,
 `name` varchar(250) collate utf8\_unicode\_ci NOT NULL default '',
 `stadt` varchar(200) collate utf8\_unicode\_ci NOT NULL default '',
 PRIMARY KEY (`id_land`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8\_unicode\_ci AUTO\_INCREMENT=4 ;

INSERT INTO `land` (`id_land`, `name`, `stadt`) VALUES
(1, 'Ein Land', 'irgendeine stadt'),
(2, 'noch ein Land', 'und nochwas'),
(3, 'Wieder', 'und nochwas');

Hallo Xaver,

Du willst nach Einträgen gruppieren nicht nach Kommentaren. Deshalb eher

SELECT eintrag.\*, land.name AS land, COUNT(\*) AS kommentare 
FROM eintrag JOIN land ON land.id\_land = eintrag.fid\_land 
JOIN kommentare ON kommentare.fid\_eintrag = eintrag.id\_eintrag 
GROUP BY id\_eintrag

MfG Georg V.

Hallo Georg!
Danke, war ja fast zu einfach :smile:

Ich hab leider noch ein Problem, wie werden einträge angezeigt, die kein Kommentar haben?

Hallo Xaver,

SELECT eintrag.\*, land.name AS land, 
 COUNT(kommentare.fid\_eintrag) AS kommentare 
 FROM eintrag JOIN land ON land.id\_land = eintrag.fid\_land
 LEFT JOIN kommentare ON kommentare.fid\_eintrag = eintrag.id\_eintrag 
 GROUP BY id\_eintrag

Bitte beachten: Kein count(*) sondern COUNT(kommentare.fid_eintrag) [Sonst bekommst für Einträge ohne Kommentare statt einer Anzahl null eine eins als Zähler] und das zweite JOIN hat sich zu einem LEFT JOIN gewandelt.

MfG

Georg V.
www.familieverweyen.de