[SQL] 3 tabellen joinen met subquery

Pagina: 1
Acties:

  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 28-07 12:50
Eerst maar even de tabellen die ik heb:

Table: users
useridname
1Jan
2Piet


Table: news
newsidtitleuserid
1Eerste Newspost1
2Tweede Newspost1
3Derde Newspost2
4Vierde Newspost1


Table: replies
replyidtextuseridnewsid
1Reply1 op news111
2Reply2 op news121
3Reply1 op news212
4Reply2 op news212
5Reply3 op news121


Zoals je ziet is dit een model voor een newspage met replies. Nu wil ik op de hoofdpagina een lijst van de newsitems neerzetten, met daarbij het aantal replies per newsitem.

Een lijst van de newsitems met posternaam krijg ik door:
code:
1
2
3
SELECT title, name
FROM news, users
WHERE news.userid = users.userid
Resultaat:
titlename
Eerste newspostJan
Tweede newspostJan
Derde newspostPiet
Vierde newspostJan



Een lijst van het aantal replies per newspost krijg ik door:
code:
1
2
3
SELECT newsid, count(replyid) AS replies
FROM replies
GROUP BY newsid
Resultaat:
newsidreplies
13
22
30
40


Maar hoe kan ik nu die twee queries combineren? Het resultaat dat ik wil krijgen is:
titlenamereplies
Eerste newspostJan3
Tweede newspostJan2
Derde newspostPiet0
Vierde newspostJan0


Ik heb al zitten rommelen met een subquery maar daar kwam ik niet uit. Toen ik begon te zoeken op het internet (en GoT) kwam ik er bovendien achter dat een subquery niet ondersteund wordt in MySQL. En dat is wel waar het uiteindelijk terecht moet komen. Een subquery is dus geen optie. Maar hoe moet het dan wél??

Ik ben al ruim 2 uur bezig met rommelen maar dit gaat even boven m'n petje. Waarschijnlijk is de oplossing erg simpel maar ik kan 't niet vinden. :(

The sentence below is true.
The sentence above is false.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Waarom wil je dat met een subquery oplossen?

Je kan toch gewoon deze 3 tabellen joinen?

code:
1
2
3
4
5
select name, titel, count(1)
FROM users, news, replies
where users.userid = news.userid
and replies.newsid = news.newsid
group by name, titel


zoiets ongeveer dus....

[ Voor 114% gewijzigd door whoami op 24-10-2003 15:35 ]

https://fgheysels.github.io/


Verwijderd

simpele group-by zal het werk al voor je doen icm eenvoudige join.

  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 28-07 12:50
whoami schreef op 24 oktober 2003 @ 15:33:
Waarom wil je dat met een subquery oplossen?

Je kan toch gewoon deze 3 tabellen joinen?
Ik wil het juist niet met een subquery omdat het dan niet in MySQL werkt. Maar dat joinen, daar snap ik dus niet veel van. Ik heb de tutorials op w3school doorgenomen. Maar volgens mij is wat ik doe bij de eerste query toch al een join van twee tabellen? Hoe doe je dat dan met 3?

[ Voor 12% gewijzigd door Maniakje op 24-10-2003 15:58 ]

The sentence below is true.
The sentence above is false.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
[nohtml]
Maniakje schreef op 24 October 2003 @ 15:37:
[...]

Ik wil het juist niet met een subquery omdat het dan niet in MySQL werkt. Maar dat joinen, daar snap ik dus niet veel van. Ik heb de tutorials op w3school doorgenomen. Maar volgens mij is wat ik doe bij de eerste query toch al een join van twee tabellen? Hoe doe je dat dan met 3?
Hetzelfde zoals je doet als met 2 tabellen, maar dan pak je er dus nog een derde bij.

https://fgheysels.github.io/


  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 28-07 12:50
Als ik het doe op de manier van whoami:

code:
1
2
3
4
SELECT n.title, u.displayname, count(r.replyid) AS replies
FROM newsposts AS n, newsreplies AS r, users AS u
WHERE n.newsid = r.newsid AND n.userid = u.userid
GROUP BY n.title, u.displayname


Geeft ie alleen de eerste newspost terug, met naam van de poster en het aantal replies. De overige newspost(s) laat ie achterwege. :?

De code die ik hier nu post is de code van de echte tabellen... het enige verschil met de versimpelde tabellen hierboven is dat er wat meer velden zijn. Het idee blijft verder hetzelfde.

The sentence below is true.
The sentence above is false.


  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 28-07 12:50
Ok, ik heb het gevonden nu.
In de tabel 'news' had ik de userid's bij 3 van de 4 posts nog op '0' staan. |:(

Nu werkt het allemaal prima. Thx voor de hulp.

*Edit*
Toch niet. Hij laat nu alleen maar de newsposts zien waar replies op zijn. Newsposts met 0 replies worden dus niet meegenomen. Dit kan ik oplossen door bij het plaatsen van een newspost meteen een 'dummy reply' mee te posten, die ik dan gewoon niet laat zien. Maar is dat niet gewoon te omzeilen door de query wat aan te passen?

[ Voor 56% gewijzigd door Maniakje op 24-10-2003 16:24 ]

The sentence below is true.
The sentence above is false.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je zult gebruik moeten maken van outer joins.
Welk database gebruik je?
Ga dan eens kijken in de manual / help hoe je outer joins gebruikt in dat DBMS, maar ga natuurlijk eerst ff kijken wat outer joins precies zijn.

https://fgheysels.github.io/


  • Maniakje
  • Registratie: Februari 2001
  • Laatst online: 28-07 12:50
whoami schreef op 24 October 2003 @ 16:36:
Je zult gebruik moeten maken van outer joins.
Welk database gebruik je?
Ga dan eens kijken in de manual / help hoe je outer joins gebruikt in dat DBMS, maar ga natuurlijk eerst ff kijken wat outer joins precies zijn.
Ik gebruik MyISAM. Over outer joins heb ik inderdaad al iets gezien op w3schools. Ik zal me er eens op gooien. Thx voor de tip. :)

...
...

*een tijdje later*

...
...

Hebbes! :)
code:
1
2
3
4
5
6
SELECT title, displayname, count(r.newsid) AS replies
FROM users AS u, newsposts AS n
LEFT JOIN newsreplies AS r ON r.newsid = n.newsid
WHERE u.userid=n.userid
GROUP BY displayname, title
ORDER BY n.posttime DESC

De info over outer joins heb ik gevonden op MSDN. Ik zet het hier maar even neer, want misschien dat iemand anders er nog wat aan heeft. :)

Thx whoami. :)

[ Voor 47% gewijzigd door Maniakje op 24-10-2003 17:28 ]

The sentence below is true.
The sentence above is false.

Pagina: 1