Avatar billede jtp Nybegynder
10. oktober 2003 - 00:58 Der er 11 kommentarer og
1 løsning

Flere counts i en SELECT

Hej alle

Håber der er nogen, der kan hjælpe mig. Jeg har behov for SELECT-sætning, der indeholder flere counts på samme kolonne, men som er betinget er værdien i rækken.

Jeg har en tabel, der ser ud som følger:

ID |  VALUE
-------------------
1  |  1
2  |  1
3  |  2
4  |  NULL
5  |  2
6  |  1

Ud af denne ville jeg gerne lave én SELECT-sætning, der gav mig en komplet oversigt over hvor mange rækker der er totalt og hvor mange rækker, der i kollonnen VALUE indeholder henholdsvis værdierne 1, 2 og NULL.

Kan dette lade sig gøre?

Jeg har prøvet mange forskellige løsninger. Mit webhotel leverer MySQL 3.23.54 og så vidt jeg har fundet, så betyder det at jeg ikke kan gøre brug af JOINs, da det først er understøttet i version 4.0 (ved ikke om det er rigtigt).

Det kunne være rart, hvis man på en COUNT kunne sætte en WHERE-klausul i stil med dette:

SELECT
COUNT(SELECT * FROM tabel WHERE VALUE = 1) AS Vaerdi1,
COUNT(SELECT * FROM tabel WHERE VALUE = 2) AS Vaerdi2,
COUNT(SELECT * FROM tabel WHERE VALUE = NULL) AS Vaerdi3,
COUNT(*) AS Total FROM tabel;

Er der nogen, der kan hjælpe?

-jtp-
Avatar billede detox Nybegynder
10. oktober 2003 - 01:22 #1
Du kan jo bruge GROUP BY:

SELECT count(*) Antal FROM tabel GROUP BY VALUE

Så kan du jo bare lægge værdierne af Antal sammen, så har du Total.
Avatar billede erikjacobsen Ekspert
10. oktober 2003 - 04:52 #2
Og den skal nok reelt være

SELECT value, count(*) as Antal FROM tabel GROUP BY VALUE

Joins virker nu fint nok i MySql versoin 3
Avatar billede jtp Nybegynder
10. oktober 2003 - 08:58 #3
Det ser kanon ud! Hvis jeg nu ønsker, at bearbejde værdien af count, hvor VALUE = 2, kan det så lade sig gøre? Lidt svært, at forklare, så her kommer et eksempel:

I øjeblikket udskriver ovenstående SELECT-sætning følgende værdier:

Null: 7
1: 158
2: 83

Det jeg så har behov for det er, at isolere f.eks. "1: 158". De andre værdier skal stadig kunne tilgås på samme måde længere nede på siden.

-jtp-
Avatar billede detox Nybegynder
10. oktober 2003 - 09:01 #4
SELECT VALUE, count(*) Antal FROM tabel WHERE VALUE=1 GROUP BY VALUE
Avatar billede jtp Nybegynder
10. oktober 2003 - 09:03 #5
Hej detox

Betyder det ikke, at jeg så er nødt til at lave 3 forskellige SELECT-sætninger? Jeg ville helst kunne arbejde videre med værdierne i det recordset, der allerede er dannet, således at jeg kun skal i databasen 1 gang.

-jtp-
Avatar billede detox Nybegynder
10. oktober 2003 - 09:06 #6
Jo, du kan fx bruge erik's forslag, men hvilket scriptsprog bruger du?
Avatar billede jtp Nybegynder
10. oktober 2003 - 09:08 #7
Almindelig PHP-serverside.
Avatar billede detox Nybegynder
10. oktober 2003 - 09:19 #8
Du kan fx gøre sådan her:

$id = array();
$res = mysql_query("SELECT VALUE, count(*) antal FROM tabel GROUP BY VALUE");
while ($row = mysql_fetch_array($res)) {
    $id[$row['VALUE']] = $row['antal'];
}

Så lægger værdierne i $id[0], $id[1], $id[2], osv...
Avatar billede detox Nybegynder
10. oktober 2003 - 09:22 #9
Du kan fx vise dem sådan:

foreach ($id as $key => $val) {
    echo "$key $val <br />";
}
Avatar billede viper_killerguy Nybegynder
16. oktober 2003 - 16:03 #10
select distinct(value), count(*) from tabel group by value

disclaimer: skrev bare noet der virkede logisk, virker sikkert ikke.
Avatar billede jtp Nybegynder
20. oktober 2003 - 23:00 #11
Hov, havde helt glemt denne!

Hvis detox, lige smider et svar, så bliver det honoreret med point for indsatsen.

Jeg lavede den "nemme" løsning med flere SELECT-sætninger, da jeg var lidt presset...
Avatar billede detox Nybegynder
20. oktober 2003 - 23:09 #12
Tja, den nemme behøver ikke være den ringeste ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester