23. september 2009 - 11:24Der er
19 kommentarer og 1 løsning
Hjælp til søgning
Jeg skal bruge et udtræk, hvor jeg opgør hvor mange personer der findes i min database mellem 0-2 år, 2-5 år, 5-15 år, 15-70 år og over 70 år. Jeg kan godt finde ud af at gøre det ved hjælp af flere søgninger, men kan det ikke gøres lidt mere raffineret? Udgangspunktet er følgende:
$sql = mysqli_query ($conn, "SELECT alder, COUNT(alder) AS antal FROM db WHERE user = '$_SESSION[user]' AND alder !='' GROUP BY alder");
Nå, jeg smider selv et svar. Nu har jeg taget lidt flere aldersklasser med. Det er ikke kønt, men det virker (sjovt, det siger min kone også):
$sql = mysqli_query ($conn," (SELECT COUNT(*) AS antal, '-2' AS leg FROM db WHERE alder <= 2 AND user = '$_SESSION[user]' AND alder !='' ) UNION (SELECT COUNT(*) AS antal, '3-5' AS leg FROM db WHERE alder > 2 AND alder <= 5 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '6-10' AS leg FROM db WHERE alder > 5 AND alder <= 10 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '11-15' AS leg FROM db WHERE alder > 10 AND alder <= 15 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '16-20' AS leg FROM db WHERE alder > 15 AND alder <= 20 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '21-30' AS leg FROM db WHERE alder > 20 AND alder <= 30 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '31-40' AS leg FROM db WHERE alder > 30 AND alder <= 40 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '41-50' AS leg FROM db WHERE alder > 40 AND alder <= 50 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '51-60' AS leg FROM db WHERE alder > 50 AND alder <= 60 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '61-70' AS leg FROM db WHERE alder > 60 AND alder <= 70 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '71-80' AS leg FROM db WHERE alder > 70 AND alder <= 80 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '81-90' AS leg FROM db WHERE alder > 80 AND alder <= 90 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '91-100' AS leg FROM db WHERE alder > 90 AND alder <= 100 AND user = '$_SESSION[user]') UNION (SELECT COUNT(*) AS antal, '101-' AS leg FROM db WHERE alder > 100 AND user = '$_SESSION[user]') ");
mysql> mysql> SELECT * FROM person; +-----------------------+------+ | personname | age | +-----------------------+------+ | Anders Andersen | 17 | | Borge Borgesen | 23 | | Christian Christensen | 24 | +-----------------------+------+ 3 rows in set (0.00 sec)
mysql> mysql> SELECT CONCAT(CAST(agegroup.low AS CHAR),'-',CAST(agegroup.high AS CHAR)) ,COUNT(person.age) AS n -> FROM person RIGHT JOIN agegroup ON agegroup.low <= person.age AND person. age <= agegroup.high -> GROUP BY CONCAT(CAST(agegroup.low AS CHAR),'-',CAST(agegroup.high AS CHAR )); +--------------------------------------------------------------------+---+ | CONCAT(CAST(agegroup.low AS CHAR),'-',CAST(agegroup.high AS CHAR)) | n | +--------------------------------------------------------------------+---+ | 0-17 | 1 | | 18-64 | 2 | | 65-200 | 0 | +--------------------------------------------------------------------+---+ 3 rows in set (0.00 sec)
ind i søgningen. Det hele skal indgå i et større script hvor jeg via nogle select-bokse vælger subgrupper af mine data. Indtil nu har jeg lavet det via if-sætninger i andre if-sætninger:
Det virker med ORDER BY agegroup.low - det synes jeg at jeg havde prøvet før jeg stillede spørgsmålet, men det havde jeg åbenbart ikke. Jeg kan imidlertid ikke finde ud af at sætte WHERE ind i strengen uden at få fejl. Skal man ikke bare gøre noget ala
SELECT CONCAT(CAST(agegroup.low AS CHAR),'-',CAST(agegroup.high AS CHAR)),COUNT(person.age) AS n FROM person RIGHT JOIN agegroup ON agegroup.low <= person.age AND person.age <= agegroup.high GROUP BY CONCAT(CAST(agegroup.low AS CHAR),'-',CAST agegroup.high AS CHAR)) WHERE user = '$_SESSION[user]' ORDER BY agegroup.low;
Glem det. Nu har jeg drukket en kop kaffe og forstået din søgning og indset at min WHERE skal sættes ind lidt tidligere:
SELECT CONCAT(CAST(agegroup.low AS CHAR),'-',CAST(agegroup.high AS CHAR)),COUNT(person.age) AS n FROM person RIGHT JOIN agegroup ON agegroup.low <= person.age AND person.age <= agegroup.high WHERE user = '$_SESSION[user]' GROUP BY CONCAT(CAST(agegroup.low AS CHAR),'-',CAST agegroup.high AS CHAR)) ORDER BY agegroup.low;
Nå, træerne vokser ikke ind i himlen. Jeg synes ikke lige jeg kan få det der med
WHERE felt=ISNULL(?,felt)
til at virke. Jeg kan se at du har svaret på det samme flere gange tidligere. Jeg har som andre før mig brug for at udelade WHERE forbeholdet når felt="NULL". Har konsulteret mySQL-manualen uden held.
Det er jeg med på, men jeg kan ikke få det til at fungere i praksis. Jeg er ikke nået til at bruge prepared statements, så jeg undlader at bruge "?". Jeg har prøvet med følgende
SELECT CONCAT( CAST( agegroup.low AS CHAR ) , '-', CAST( agegroup.high AS CHAR ) ) , COUNT( erfaring_anaestesier.alder ) AS antal FROM erfaring_anaestesier RIGHT JOIN agegroup ON agegroup.low <= erfaring_anaestesier.alder AND erfaring_anaestesier.alder <= agegroup.high WHERE asa = ISNULL('$_GET[asa]',asa) GROUP BY CONCAT( CAST( agegroup.low AS CHAR ) , '-', CAST( agegroup.high AS CHAR ) ) ORDER BY agegroup.low
Det virker ikke. Kommer med følgende fejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'asa) GROUP BY CONCAT(CAST(agegroup.low AS CHAR),'-',CA' at line 3
Hvis der i en form eksplicit angives NULL vil jeg da mene at det er OK at fortolke det som 'NULL' og dermed ikke finde nogle matches.
NULL betyder ikke-udfyldt. Udfyldt med ikke-udfyldt virker selvmodsigende paa mig.
Men det er din app, saa du ved hvordan den skal fungere.
Synes godt om
Ny brugerNybegynder
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.