GROUP BY bei LEFT JOIN

rambo

Mitglied
Hallo,

ich bin dabei ein kleines Forum zu coden. Ich hab nun ein Problem mit der Anzeige, wie viele Themen und Beiträge in einem Board vorhanden sind. Ich möchte das alles und die id und den Namen des Boards mit einer Query auslesen. Ich habe es so ausprobiert:

Code:
SELECT b.id, b.isCategory, b.name, COUNT(p.id) posts, COUNT(p2.id) threads FROM boards b LEFT JOIN posts p ON p.board = b.id LEFT JOIN posts p2 ON p2.board = b.id GROUP BY p2.thread, b.id ORDER BY b.id ASC

Dies gibt mir aber immer so viele Zeilen aus, wie die Anzahl der Themen. Die Anzahl der Beiträge und Themen spinnt vollkommen.

Code:
--
-- Tabellenstruktur für Tabelle `posts`
--

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `subject` varchar(80) NOT NULL,
  `board` int(10) NOT NULL,
  `thread` int(10) NOT NULL,
  `message` longtext NOT NULL,
  `user` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Daten für Tabelle `posts`
--

INSERT INTO `posts` (`id`, `subject`, `board`, `thread`, `message`, `user`) VALUES
(1, 't2t', 2, 1, 'tt', 1),
(2, '12', 2, 2, '12', 1),
(3, '12312', 2, 1, '11', 1),
(4, 'test', 2, 4, 'test', 1);

--
-- Tabellenstruktur für Tabelle `boards`
--

CREATE TABLE IF NOT EXISTS `boards` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `isCategory` tinyint(4) NOT NULL,
  `name` varchar(80) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Daten für Tabelle `boards`
--

INSERT INTO `boards` (`id`, `isCategory`, `name`) VALUES
(2, 0, 'test'),
(1, 1, 'cat'),
(4, 1, 'test'),
(5, 0, 'b');

Danke im Voraus.
 
Es spinnt nicht. Du hast irgendwie ein undurchsichtiges Query
Ich habs mal formatiert, damit man es auch lesen kann
SQL:
SELECT
	b.id, 
	b.isCategory, 
	b.name,
	COUNT(p.id) posts, 
	COUNT(p2.id) threads 
FROM 
	boards b 
	LEFT JOIN posts p 
		ON p.board = b.id 
	LEFT JOIN posts p2 
		ON p2.board = b.id 
GROUP BY p2.thread, b.id 
ORDER BY b.id ASC
Was ist der Unterscheid zwischen p und p2? Beides ist die Tabelle posts die über das Feld board mit boards.id verbunden ist.

Irgendwie sind da die Verknüpfungen nicht sauber

Nachtrag:
Suchst du ev. so etwas?
SQL:
SELECT
	b.id, 
	b.isCategory, 
	b.name,
	COUNT(p.board) posts, 
	COUNT(DISTINCT p.thread) threads 
FROM 
	boards b 
	LEFT JOIN posts p 
		ON p.board = b.id
GROUP BY b.id 
ORDER BY b.id ASC
 
Zuletzt bearbeitet von einem Moderator:
Ich habe die Themen und die Beiträge in der gleichen Tabellen (posts). p2 kann man auch "threads" nennen.

SQL:
SELECT
boards.id,
boards.isCategory,
boards.name,
COUNT(posts.id) posts,
COUNT(threads.id) threads
FROM
boards
LEFT JOIN posts
ON posts.board = boards.id
LEFT JOIN posts threads
ON threads.board = boards.id
GROUP BY threads.thread, boards.id
ORDER BY boards.id ASC
 
Zuletzt bearbeitet von einem Moderator:
Ist irgendwie eine unlogische Zusammenstellung. In deinem Fall unterscheidest du nicht zwischen Threads und Postings.
Hast du meine Nachtrag gesehen?
Nachtrag:
Suchst du ev. so etwas?
SQL:
SELECT
    b.id, 
    b.isCategory, 
    b.name,
    COUNT(p.board) posts, 
    COUNT(DISTINCT p.thread) threads 
FROM 
    boards b 
    LEFT JOIN posts p 
        ON p.board = b.id
GROUP BY b.id 
ORDER BY b.id ASC
 
Zuletzt bearbeitet von einem Moderator:
Nein, ich hatte deinen Nachtrag nicht gesehen, ich habe schon wieder zu schnell geantwortet. Der Code von dir Funktioniert auf jeden fall einwandfrei.

Danke für die extrem schnelle Hilfe.

Gruß Maximilian.
 
Zuletzt bearbeitet:
Ich habe doch noch ein Problem mit dieser Query :)

Ich wollte jetzt noch den Letzen Beitrag auslesen, was auch funktioniert.
SQL:
SELECT b.id, b.isCategory, b.name, COUNT( p.board ) posts, COUNT( DISTINCT p.thread ) threads, p.id lastPostId, p.subject lastPostSubject
FROM boards b
LEFT JOIN posts p ON p.board = b.id
GROUP BY b.id
ORDER BY b.id ASC

Jetzt wollte ich aber auch noch den Benutzernamen des Lastpost-Schreibers haben. Ich haben noch ein LEFT JOIN drangehängt (LEFT JOIN users u ON p.user = u.id). Jetzt wird aber der erste Beitrag angezeigt, nicht so wie bei der urspünglichen Query der letze.
 
Zuletzt bearbeitet von einem Moderator:
Zurück