3 verschillende WHERE statements, 1 tabel in MYSQL/ADO.net

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
Ik heb in ADO.net een forum gemaakt, dat vrij veel lijkt op het forum hier op GoT.

Het forum bestaat uit categorieën, daarin staan boards, per board zijn er de topics en per topic een of enkele posts.

Nu wil ik iets als dit bekomen:

Categorie 1
  • Board1 [list]
  • aantal topics in board
  • aantal posts in board
  • [/list] Board2 [list]
  • aantal topics in board
  • aantal posts in board
  • [/list]
Categorie 2
...

Ik ben er in geslaagd om via subqueries dit (link naar forum) al te bekomen (wat niet zo simpel was).

Zoals je daar ook kan zien, gebeurt de teling van het aantal posts en topics niet correct...

Ik weet hoe ik de topics kan tellen per board, hoe ik het aantal posts kan tellen per board, maar niet hoe ik dat allebei in dezelfde query kan doen.

Ik heb dus eerst geprobeerd om in MYSQL de 2 query's samen te voegen, maar dit lukt me niet omdat ze verschillende WHERE statements hebben.

De query's:

Selecteert de boards per cathegorie
SQL:
1
2
3
SELECT  tblforum_board.catid, tblforum_board.boardid, tblforum_board.boardname, tblforum_board.boardicon, tblforum_board.boarddesc
FROM tblforum_board 
ORDER BY tblforum_board.catid;


Selecteert de boards per cathegorie + het aantal topics
SQL:
1
2
3
4
SELECT  tblforum_board.catid, tblforum_board.boardid, tblforum_board.boardname, tblforum_board.boardicon, tblforum_board.boarddesc , Count(tblforum_topic.topicid) AS numberoftopics 
FROM tblforum_board LEFT Join tblforum_topic ON tblforum_topic.boardid = tblforum_board.boardid 
WHERE tblForum_topic.published = 1 
GROUP BY tblforum_board.catid, tblforum_board.boardid;



Selecteert de boards per cathegorie + het aantal posts
SQL:
1
2
3
4
SELECT  tblforum_board.catid, tblforum_board.boardid, tblforum_board.boardname, tblforum_board.boardicon, tblforum_board.boarddesc , Count(tblforum_post.postid) AS numberofposts 
FROM tblforum_board LEFT Join tblforum_topic ON tblforum_topic.boardid = tblforum_board.boardid LEFT Join tblforum_post ON tblforum_topic.topicid = tblforum_post.topicid 
WHERE tblForum_topic.published = 1 and tblForum_post.published = 1 
GROUP BY tblforum_board.catid, tblforum_board.boardid;


Nu wil ik dus iets dat de boards per categorie selecteert + het aantal topics + het aantal posts.
Is dit mogelijk in 1 query?

Ik heb ook al op dataset niveau in ADO.net geprobeerd om de 3 tabellen te "mergen", maar ik krijg dan iets als dit:


CatID

boardID

...

numberoftopics

numberofposts

1

1

...



1

2

...






2





1






3





1


Ik hoop dat de tijd die ik gestoken heb in de UBB-codes van deze post niet heb verspilt, en dat iemand me dus kan helpen :)

Acties:
  • 0 Henk 'm!

  • Tazzios
  • Registratie: November 2001
  • Laatst online: 13:56

Tazzios

..

"SELECT
(SELECT COUNT_big(*) FROM tabel? WHERE CatID = 1) AS categorie1,
(SELECT COUNT_big(*) FROM tabel? WHERE CatID = 1) AS categorie2"

Op deze wijze kun je meerdere statements tegelijk doen.

[ Voor 20% gewijzigd door Tazzios op 06-04-2010 15:50 . Reden: iets meer uitleg ]


Acties:
  • 0 Henk 'm!

  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
Tazzios schreef op dinsdag 06 april 2010 @ 15:47:
"SELECT
(SELECT COUNT_big(*) FROM tabel? WHERE CatID = 1) AS categorie1,
(SELECT COUNT_big(*) FROM tabel? WHERE CatID = 1) AS categorie2"

Op deze wijze kun je meerdere statements tegelijk doen.
Mmmh,

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT

(SELECT  Count(tblforum_topic.topicid)
FROM tblforum_board LEFT Join tblforum_topic ON tblforum_topic.boardid = tblforum_board.boardid 
WHERE tblForum_topic.published = 1
GROUP BY tblforum_board.catid, tblforum_board.boardid)
AS numberoftopics,

(SELECT Count(tblforum_post.postid) 
FROM tblforum_board LEFT Join tblforum_topic ON tblforum_topic.boardid = tblforum_board.boardid LEFT Join tblforum_post ON tblforum_topic.topicid = tblforum_post.topicid 
WHERE tblForum_topic.published = 1 and tblForum_post.published = 1 
GROUP BY tblforum_board.catid, tblforum_board.boardid)
AS numberofposts;


Geeft een lege tabel weer...
Wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • Tazzios
  • Registratie: November 2001
  • Laatst online: 13:56

Tazzios

..

Dit is hoe hij bij jouw waarschijnlijk werkt.

SQL:
1
2
3
4
5
6
7
SELECT

(SELECT  Count(*)
FROM tblForum_topic
WHERE  tblForum_topic.Catid = 1 AND  tblForum_topic.published = 1
)
AS numberoftopicsCatid1


Bedenk me net dat je wel voor elke categorie de SQLcode uit zou moeten voeren.
Op deze wijze zou je het alsnog in een tussen tabel moeten gooien :|

[ Voor 20% gewijzigd door Tazzios op 06-04-2010 16:33 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een andere mogelijkheid is een "Count(DISTINCT tblforum_topic.topicid) AS numberoftopics" te doen. Overigens zijn dit soort dingen in een echt forum vaak gedenormaliseerd, omdat dit best wel veel tijd kan kosten zo. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
pedorus schreef op dinsdag 06 april 2010 @ 16:37:
Een andere mogelijkheid is een "Count(DISTINCT tblforum_topic.topicid) AS numberoftopics" te doen. Overigens zijn dit soort dingen in een echt forum vaak gedenormaliseerd, omdat dit best wel veel tijd kan kosten zo. :p
Ik denk dat, ondanks m'n mooie list en tabelletje, het nog niet duidelijk is wat ik wil...
Met Count(DISTINCT tblforum_topic.topicid) AS numberoftopics tel ik toch het aantal "distinct", dus unieke waarden in tblforum_topic.topicid???

Wat ben ik hier mee?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Count(distinct ...) werkt per groep, en je doet al een group by...

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1