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");
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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.