2 query's samenvoegen
Query 1:
SELECT reactie.* , users.type
FROM reactie, users
WHERE reactie.id = '" .$_GET["id"]. "'
AND reactie.auteur = users.gebruikersnaam
GROUP BY reactie.nr
ORDER BY reactie.nr DESC";
Query 2:
SELECT auteur, COUNT(*)
FROM reactie
GROUP BY auteur
de auteur van de 2de query hoeft niet weergegeven te worden zolang ik maar alle reacties krijg per auteur.
De eerste query laat alle reacties zijn per topic en het type gebruiker. Hier wil ik dus ook graag het aantal reacties van de gebruiker bij hebben staan!
Gewijzigd op 01/01/1970 01:00:00 door Jan Horden
Om je te kunnen helpen moeten we wel even weten hoe je datamodel eruit ziet?
onderstreept is primairy key en tussen <> is foreign key maar foreign key's zijn niet zo gedeclareerd in phpmyadmin. Wist namelijk niet hoe dat moest.
Tabel reactie:
<id> int (dit is het topic id)
nr int AUTO_INCREMENT
reactie varchar
<auteur> varchar (fkey van gebruikersnaam)
datum DATETIME
Tabel users:
id int AUTO_INCREMENT
<gebruikersnaam> varchar
voornaam varchar
achternaam varchar
email varchar
lid_sinds DATETIME
type enum
edit: Het gaat om een forum zoals je waarschijnlijk al door had maar denk niet dat het echt relevant is.
Gewijzigd op 01/01/1970 01:00:00 door Jan Horden
Hmm, je datamodel klopt niet helemaal. Wat is het verschil tussen een user en een auteur bij jou?
edit: vergeten te vermelden dat auteur een foreign key is van gebruikersnaam
ik neem aan dat je gebruikersnaam bedoeld met user?
Gewijzigd op 01/01/1970 01:00:00 door Jan Horden
users
------------------
id
naam
topics
------------------
id
titel
posts
------------------
id
topic_id
user_id
dt_posted
tekst
Dan klopt je datamodel al een heel stuk beter en wordt het ook gemakkeliker om goeie query's op te stellen. Andere namen voor dezelfde entiteiten in je database raad ik je af om verwarring te voorkomen.
id int
onderwerp varchar (naam vd topic)
<auteur> varchar (weer foreign key met gebruikersnaam)
datum datetime
edit: ik weet dat bij tabel reactie topic id veel beter was geweest dan id om verwarring te voorkomen maar dit wijzig ik later wel. Dan mag ik weer het een en ander aan code omgooien namelijk...
Gewijzigd op 01/01/1970 01:00:00 door Jan Horden
Daarom is een goed datamodel dus zo belangrijk. Als je kijkt naar mijn voorbeeld, welke velden zou je dan precies willen hebben?
van posts alle (posts.*) en van users het type (staat er btw niet in ;) ) en dan nog eens het aantal posts per user.
kan je me dan verder helpen Jan?
Bedoel je echt alle posts, of alle posts van één topic?
jah per topic maar dat regel ik zelf wel... questie van WHERE reactie.id = '" .$_GET["id"]. "' (onderwerp id dus)
Maar het probleem waar ik mee zit is die GROUP BY. Want zodra ik ga groeperen per posts.id (in jouw model) dan krijg ik dus het aantal reacties per post en niet per gebruiker! Hoe ik dat moet omzeilen weet ik dus niet en daar heb ik je hulp dus voor nodig ;)
GROUP BY posts.id, users.nogwat?
Nee zo simpel is het helaas niet want dan groupeerd hij in eerste instantie nog per posts.id en dan pas per users.gebruikersnaam dacht ik. Iig had ik dat al geprobeerd en dat werkte niet!
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT r.*, u.type, u.gebruikersnaam, COUNT(u.id) AS aantal
FROM reactie AS r
LEFT JOIN users AS u
ON (r.auteur = u.gebruikersnaam)
WHERE r.id = ".intval($_GET['id'])."
ORDER BY r.nr DESC
FROM reactie AS r
LEFT JOIN users AS u
ON (r.auteur = u.gebruikersnaam)
WHERE r.id = ".intval($_GET['id'])."
ORDER BY r.nr DESC
?
dan zit je nog met het GROUP BY probleem eddy. Als ik groepeer op r.id krijg ik alle aantallen op 1 en als ik groepeer op u.id dan krijg ik niet alle reacties te zien. En die GROUP BY is verplicht
Je doet een count, maar die kun je natuurlijk ook anders doen.. Waarom op SQL niveau als je het ook op PHP niveau kan doen? Gewoon in je foreach/while een counter plaatsen ;)
de volledige 2 query's staan in m'n eerste post en daarstraks heb ik de query van Eddy gebruikt en dr alleen een GROUP BY aan toegevoegd. Maar als jij mij kan vertellen hoe ik een counter in m'n while lus kan plaatsen dan ben ik natuurlijk ook tevreden. Ik dacht alleen dat dit niet ging.
iChris schreef op 21.10.2008 14:18:
Je doet een count, maar die kun je natuurlijk ook anders doen.. Waarom op SQL niveau als je het ook op PHP niveau kan doen? Gewoon in je foreach/while een counter plaatsen ;)
eeehrm... omdat het over het algemeen sneller is alles rond het ophalen van gegevens in SQL te doen? ik heb niet de volledige thread doorgelezen, maar over het algemeen is het toch aan te raden om zoveel mogelijk op databaseniveau af te handelen
Edit: Bij een goede server is die snelheid trouwens te verwaarlozen. Het is nog altijd MySQL, en als je niet heb genormaliseerd is het alsnog een rotzooi.
Gewijzigd op 01/01/1970 01:00:00 door - -