[MySQL] COUNT() op gejoinede tabellen

Pagina: 1
Acties:

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Topicstarter
Ik zit nu al een tijdje te klootzakken, en ik kom er echt niet uit gewoon. Nou ben ik al niet zo'n enorme held in SQL, dus alle tips zijn welkom :)

Dit is het database ontwerp (relevante gedeelte)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tabel companies
---------------
companyID  PK
name     \ samengestelde FULLTEXT index
city     /

tabel comtypes
--------------
comTypeID  PK
name     FULLTEXT index

tabel com_typ
-------------
comTypeID \ samengestelde PK
companyID /

tabel sectors
-------------
sectorID PK
name     FULLTEXT index

tabel com_sec
-------------
sectorID  \ samengestelde PK
companyID /

In deze tabellen staan dus verschillende bedrijven, die tot verschillende sectoren en verschillende bedrijfssoorten horen.

Nu moet ik een zoekfunctie toepassen op deze tabellen. Ik dacht, nou laat ik nou eens dat fenomeen FULLTEXT search uitproberen. vandaar al die fulltext indices.

Dus een searchquery wordt ongeveer als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT
   companies.companyID,
   companies.name,
   companies.city,
   MATCH(companies.name,companies.city) AGAINST ( 'asdfsdf' ) +
   MATCH(comtypes.name) AGAINST ('asdfsdf') +
   MATCH(sectors.name) AGAINST ('asdfsdf')
                as score
FROM
   comtypes
   LEFT JOIN
    com_typ
   USING (comTypeID)
   LEFT JOIN
    companies
   USING (companyID)
   LEFT JOIN
    com_sec
   USING(companyID)
   LEFT JOIN 
    sectors
   USING(sectorID)
WHERE (
   MATCH(companies.name,companies.city) AGAINST ( 'asdfsdf' )
   OR MATCH(comtypes.name) AGAINST ('asdfsdf')
   OR MATCH(sectors.name) AGAINST ('asdfsdf') 
)
GROUP BY
   companies.companyID
ORDER BY 
   score DESC

waar "asdfsdf" dus de zoekwoorden zijn die men invult. Nou, dat gaat allemaal prima. Maar, mijn mooie bladerfunctie (met LIMIT x,y) heeft ook een COUNT() op deze resultaten nodig.

Dus ik dacht, ok, dezelfde criteria (WHERE gedeelte) en dezelfde GROUP BY, zou toch een goede COUNT() op moeten leveren:
code:
1
2
3
4
5
6
7
8
SELECT 
   COUNT(companies.companyID) as cnt
FROM
   ## dezelfde JOINed meuk ##
WHERE
   ## dezelfde MATCH meuk ##
GROUP BY
   companies.companyID

nee dus. Dan krijg ik dus een aantal counts.

De counts die ik dan namelijk krijg is de volgende:
wanneer ik geen GROUP BY deed in de bovenste query, kreeg ik per bedrijf meerdere resultaten. Hoeveel resultaten dat dus zijn per bedrijf is dus deze count. Logisch, want ik group by companies.companyID... toch?

Oh, maar dan moet je toch gewoon COUNT(* ) gebruiken, zonder GROUP BY?? Nee, want dan COUNT hij dus wel op meerdere resultaten per bedrijf, terwijl dat dus niet moest...

Hoe krijg ik dan wel het totaal??

Ik zit vast gewoon de verkeerde kant op te denken, dus wie geeft me een zetje in de goeie richting?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Werkt een "count(distinct companyID)" niet?

Met een weglating van de group by. Aangezien group by de pakketjes samenpakt en ze dan naar de count() stuurt gaat het daarmee iig niet lukken :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Topicstarter
Dat werkt dus wel, ja...
* drm moet de manual beter lezen |:(

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz