Avatar billede miss-g Seniormester
30. marts 2018 - 03:49 Der er 7 kommentarer og
3 løsninger

Antal tomme (null) i databasen og andre regnestykker

Jeg har en query på en tabel i databasen, og kunne nu godt tænke mig php-kode på følgende. Det er ikke bare at tælle rækker, da nogle af felterne i tabellen er tomme....

- Antal ord_dansk
- Antal ord_engelsk
- Antal ord_svensk
- Antal ord_tysk

<?php
$rs_ord = new WA_MySQLi_RS("rs_ord",$conn,1);
$rs_ord->setQuery("SELECT ord_dansk, ord_svensk, ord_engelsk, ord_tysk FROM ordliste");
$rs_ord->execute();
?>
--------------------------
Når vi har antal kan man måske lave et regnestykke i PHP???
Antal ord_dansk minus ord_engelsk = engelske ord, der mangler oversættelse.
Avatar billede arne_v Ekspert
30. marts 2018 - 04:00 #1
"SELECT COUNT(ord_dansk) AS nodk, COUNT(ord_svensk) AS nosv, COUNT(ord_engelsk) AS noen, COUNT(ord_tysk) AS noty FROM ordliste"
Avatar billede arne_v Ekspert
30. marts 2018 - 04:00 #2
COUNT(feltnavn) taeller nemlig kun naar felt ikke er NULL.
Avatar billede miss-g Seniormester
30. marts 2018 - 04:06 #3
Virker det med PHP 7?

Hvordan vil du gribe regnestykket an? Det skal måske slet ikke være PHP?
Avatar billede arne_v Ekspert
30. marts 2018 - 04:19 #4
Ja du kan jo nemt traekke vaerdierne fra hinanden.
Avatar billede miss-g Seniormester
30. marts 2018 - 04:51 #5
Nu kan jeg jo ikke programmere....

Når der eksisterer en query, kan man så bare echo antal ord?
Avatar billede olsensweb.dk Ekspert
30. marts 2018 - 10:54 #6
#2 virker ikke helt efter hensigten
test tabel
CREATE TABLE `ordliste` (
  `id` int(11) NOT NULL,
  `ord_engelsk` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `ord_dansk` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `ord_svensk` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `ord_tysk` varchar(255) COLLATE utf8_danish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

INSERT INTO `ordliste` (`id`, `ord_engelsk`, `ord_dansk`, `ord_svensk`, `ord_tysk`) VALUES
(1, 'cat', 'kat', '', ''),
(2, 'dog', 'hund', '', ''),
(3, 'horse', 'hest', '', ''),
(4, 'pig', 'gris', '', ''),
(5, 'goat', 'ged', '', ''),
(6, 'rabbit', 'kanin', '', '');

ALTER TABLE `ordliste`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `ordliste`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;COMMIT;



SELECT COUNT(id) AS norows, COUNT(ord_dansk) AS nodk, COUNT(ord_svensk) AS nosv, COUNT(ord_engelsk) AS noen, COUNT(ord_tysk) AS noty FROM ordliste

output
norows,nodk,nosv,noen,noty
6,6,6,6,6


ønsket 6,6,0,6,0

tilgengæld ser det rigtigere ud med en IF i count

SELECT COUNT(id) AS norows, COUNT(IF(ord_dansk !='',1 ,NULL)) AS nodk, COUNT(IF(ord_svensk !='',1 ,NULL)) AS nosv, COUNT(IF(ord_engelsk !='',1 ,NULL)) AS noen, COUNT(IF(ord_tysk !='',1 ,NULL)) AS noty FROM ordliste


jeg har COUNT(id) med for at have det totale antal rækker med ud, for det tilfælde der er nogle blanke ord i engelsk eller dansk

hvorfor skal man i count bruge NULL og ikke 0 ??
Avatar billede olsensweb.dk Ekspert
30. marts 2018 - 12:46 #7
må indrømme SUM tiltaler mig mere end COUNT i denne sammenhæng
SELECT COUNT(id) AS norows,
SUM(IF(ord_dansk !='',1 ,0)) AS nodk,
SUM(IF(ord_svensk !='',1 ,0)) AS nosv,
SUM(IF(ord_engelsk !='',1 ,0)) AS noen,
SUM(IF(ord_tysk !='',1 ,0)) AS noty
FROM ordliste


og muligvis bruge CASE istedet for IF, hvilke giver flere muligheder
SELECT COUNT(id) AS norows,
SUM( CASE WHEN ord_dansk !='' THEN 1 ELSE 0 END ) AS nodk,
SUM( CASE WHEN ord_svensk !='' THEN 1 ELSE 0 END ) AS nosv,
SUM( CASE WHEN ord_engelsk !='' THEN 1 ELSE 0 END ) AS noen,
SUM( CASE WHEN ord_tysk !='' THEN 1 ELSE 0 END ) AS noty
FROM ordliste

det virker mere logisk i min optik, men der er måske noget performence der spiller ind
Avatar billede arne_v Ekspert
30. marts 2018 - 19:52 #8
COUNT(felt) goer praecis hvad den skal - taeller dem som ikke er NULL.

Men '' er ikke det samme som NULL.

NULL betyder er der ikke er en vaerdi
'' betyder at der er en vaerdi og vaerdien er en tom streng

Anvendt paa den specifikke problem stilling:

NULL betyder at der ikke er indtastet en vaerdi for sproget
'' betyder at den bedste oversaettelse tild et paagaeldende sprog er ingenting

Ja - det er ret almindeligt at blande '' og NULL sammen.

Hvis man vil behandle '' og NULL ens saa virker olsen's loesning med:

COUNT(IF(felt != '', 1, NULL))

omend jeg nok ville have lavet den som:

COUNT(IF(felt != '', felt, NULL))

da 1 ikke rigtigt har nogen betydning.
Avatar billede arne_v Ekspert
30. marts 2018 - 19:55 #9
SUM(IF(felt != '', 1, 0))

virker ogsaa, men skal have laest det med smaat omkring NULL inden man er sikker.
Avatar billede miss-g Seniormester
31. marts 2018 - 23:43 #10
Takker :-)
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

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