[mysql] Meerdere velden tellen in een query

Pagina: 1
Acties:

  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 21-07 01:24

Fatamorgana

Fietsen is gezond.

Topicstarter
Hallo,

Ik heb een tabel met projecten. Een project heeft een status (closed) welke aangeeft of deze open 'N' of gesloten 'Y' is. Nu wil ik in 1 query alle projecten tellen en tevens alle projecten die open en gesloten zijn.

Ik heb dit voor elkaar gekregen met de volgende query:
code:
1
2
SELECt COUNT(id), SUM(CASE WHEN closed = 'Y' THEN 1 ELSE 0 END) AS closed, SUM(CASE WHEN closed = 'N' THEN 1 ELSE 0 END) AS open
FROM projects

Alleen vind ik dat conditionele stukje in SUM niet zo erg mooi.

Weet iemand een simpelere manier om hetzelfde voor elkaar te krijgen of is deze manier gewoon goed?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik zou er geen andere manier voor weten, behalve dan om andere conditionele constructies te nemen (bijv IF of NULLIF), die allemaal niet beter presteren, hooguit ietsje korter op te schrijven zijn en meestal minder compatibel met andere databases zijn.
Overigens werkt dit ook al in mysql, omdat ie impliciet een boolean naar 1 converteert:
SUM(closed = 'Y') maar ook dat is niet zo compatibel met andere sql-producten.

Dus misschien is het niet "mooi", maar het bespaart je wel twee losse selects over die projects-tabel waarbij je dan de closed/open conditie in de where-clause zou zetten.

En er is natuurlijk nog deze:
SQL:
1
2
3
SELECT closed, count(*)
FROM projects
GROUP BY closed


Maar door de group by zal die ook niet echt sneller zijn, en is het resultaat ietsje minder makkelijk te gebruiken.

[ Voor 16% gewijzigd door ACM op 06-01-2007 17:22 ]


Verwijderd

Als closed alleen 'Y' of 'N' kan zijn kun je 1 van die SUM(...)s weglaten. Die is dan nl. COUNT(*) - die andere SUM.
Verder valt hier niet zo gek veel aan te optimaliseren.

  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 21-07 01:24

Fatamorgana

Fietsen is gezond.

Topicstarter
ok, bedankt voor de info! Dan hou ik hier hier gewoon bij :)