Ik ben zelf een forum aan het schrijven en ik loop nu al tegen het eerste probleem, ik wil in een query alle categorieën selecteren en ook het aantal topics in die categorie.
Dit is de query die ik nu gebruik:
<?php
$sFora = " SELECT
c.c_id,
c.naam,
COUNT(t.t_id) AS aantaltopics
FROM
cats AS c,
topics AS t
WHERE
t.t_id = c.c_id
;";
?>
De foutmelding die ik krijg:
Error!
Fout: SQL-fout
Query: SELECT c.c_id, c.naam, COUNT(t.t_id) AS aantaltopics FROM cats AS c, topics AS t WHERE t.t_id = c.c_id ;
Errornummer: 1140
Foutmelding: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Ik begrijp hieruit dat ik iets met het GROUP BY element moet doen, maar daar begrijp ik niet heel erg veel van, ik heb hier een tutorial over GROUP BY gelezen maar ik snap het nog steeds niet echt.
Hoe ziet de structuur van je tabellen eruit, ik krijg namelijk het vermoeden dat je je tabellen op een verkeerde manier koppelt.
Zoals ik het nu zie koppel je het id van een topic uit de tabel topics aan het id van een categorie uit de tabel cats. Dit is niet juist.
Je zult de kolom met het id van een categorie uit de tabel cats moeten koppelen aan een kolom in de tabel topics die aangeeft tot welke categorie een topic behoort. Oftwel de foreign key uit de topics tabel die slaat op de categorie tabel.
ps. HAVING ga je hoogstwaarschijnlijk niet nodig hebben in je query.
<?php
$sFora = " SELECT
c.c_id,
c.naam,
COUNT(t.t_id) AS aantaltopics
FROM
cats AS c,
topics AS t
WHERE
t.t_id = c.c_id
GROUP BY
c.c_id,
c.naam,
COUNT(t.t_id) AS aantaltopics
";
?>
en zo?
[edit]@ Blanche ik snap niet waarom dat in MYSQL nou weer anders moet zijn. Het wordt iig niet makkelijker van[/edit]
-- phpMyAdmin SQL Dump
-- version 2.8.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generatie Tijd: 22 Jan 2007 om 20:11
-- Server versie: 5.0.27
-- PHP Versie: 5.1.4
--
-- Database: `forum`
--
[edit]
Heb de namen van phphulp.nl overgenomen om te testen om het forum te maken, wordt nog anders ga het natuurlijk niet namaken, als het af is is het de bedoeling dat als je de setup draait zelf een forum kan 'maken'
[/edit]
-- --------------------------------------------------------
--
-- Tabel structuur voor tabel `cats`
--
CREATE TABLE `cats` (
`c_id` smallint(3) NOT NULL auto_increment,
`naam` varchar(30) NOT NULL,
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
--
-- Gegevens worden uitgevoerd voor tabel `cats`
--
INSERT INTO `cats` VALUES (1, 'PHP');
INSERT INTO `cats` VALUES (2, 'SQL');
INSERT INTO `cats` VALUES (3, 'OOP');
INSERT INTO `cats` VALUES (4, 'Koffiehoek');
-- --------------------------------------------------------
--
-- Tabel structuur voor tabel `members`
--
CREATE TABLE `members` (
`m_id` mediumint(10) NOT NULL auto_increment,
`voornaam` varchar(50) NOT NULL,
`achternaam` varchar(50) NOT NULL,
`straatnaam` varchar(50) NOT NULL,
`huisnummer` varchar(6) NOT NULL,
`postcode` varchar(6) NOT NULL,
`land` smallint(1) NOT NULL default '0',
`geslacht` varchar(1) NOT NULL,
`geboortedatum` datetime NOT NULL,
`about` text NOT NULL,
`msn` varchar(50) NOT NULL default '0',
`website` varchar(30) NOT NULL default '0',
`email` varchar(50) NOT NULL,
`gebruikersnaam` varchar(20) NOT NULL,
`wachtwoord` varchar(32) NOT NULL,
`ip` varchar(20) NOT NULL,
`registreerdatum` datetime NOT NULL,
`laatstonline` datetime NOT NULL,
`posts` smallint(5) NOT NULL default '0',
`rank` smallint(1) NOT NULL default '0',
`geactiveerd` smallint(1) NOT NULL default '0',
`f_afbeelding` smallint(6) NOT NULL default '0',
`p_afbeelding` smallint(6) NOT NULL default '0',
PRIMARY KEY (`m_id`),
UNIQUE KEY `uniekemailgebruikersnaam` (`gebruikersnaam`,`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
--
-- Gegevens worden uitgevoerd voor tabel `members`
--
INSERT INTO `members` VALUES (1, 'Freek', 'Boutkan', 'Prinses Irenelaan', '52', '2341TT', 0, 'M', '1992-05-13 19:17:43', 'Hoi, ik ben een lid', '0', '0', '[email protected]', 'freeky', '147538da338b770b61e592afc92b1ee6', '192.168.1.33', '2007-01-17 19:19:00', '2007-01-17 19:19:00', 0, 0, 0, 0, 0);
-- --------------------------------------------------------
--
-- Tabel structuur voor tabel `topics`
--
CREATE TABLE `topics` (
`t_id` int(12) NOT NULL,
`m_id` mediumint(10) NOT NULL,
`c_id` smallint(3) NOT NULL,
`vraag` text NOT NULL,
PRIMARY KEY (`t_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Gegevens worden uitgevoerd voor tabel `topics`
--
@Willem: Deze error krijg ik, we zijn weer precies even ver als waar we begonnen *zucht*
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
[edit]
De namen die in de database staan zijn overgenomen van PHP hulp om gewoon iets te inserte, ik ga het niet namaken of zo het moet een forum worden waar de admin cats can toevoegen en verwijderen maar dat komt later
[/edit]
ik snap niet waarom dat in MYSQL nou weer anders moet zijn. Het wordt iig niet makkelijker van
Het wordt er juist wel makkelijker van. Het is een uitbreiding die de normale werking van GROUP BY niet verandert.
ik weet zeker dat je daarmee moet groeperen op alles wat in de SELECT staat behalve datgene wat je met de agregate?? functie, in dit geval COUNT() opvraagd
Wat je hier zegt, klopt in ieder geval niet. Je mag ook rustig op slechts 1 veld groeperen; de enige voorwaarde is dat dat veld ook voorkomt in de SELECT. Die voorwaarde is er by MySQL niet. Je mag dus rustig iets doen als:
SELECT COUNT(id)
FROM tabel
GROUP BY name
En dit mag niet in "puur" SQL, daar moet je het veld name toevoegen aan je select.
@Klaasjan: Volgens mij mag in een GROUP BY nooit een aggregate functie of een alias van het resultaat van zo'n functie voorkomen.
Volgens mij is het eerder zo:
SELECT
c.c_id,
c.naam,
COUNT(t.t_id) AS aantaltopics
FROM
cats AS c
LEFT JOIN
topics AS t
ON
c.c_id = t.c_id
GROUP BY
c.c_id,
c.naam
ps.
Wat je hier zegt, klopt in ieder geval niet. Je mag ook rustig op slechts 1 veld groeperen; de enige voorwaarde is dat dat veld ook voorkomt in de SELECT. Die voorwaarde is er by MySQL niet.
Maar als er meerdere kolommen in je SELECT voorkomen zul je daar in standaard SQL ook op moeten groeperen. Dit hoeft in MySQL niet, en dat is een uitzondering. En volgens mij mag je in standaard SQL ook prima groeperen op een kolom die niet in je SELECT query voor komt!