Avatar billede cyberdude Nybegynder
01. oktober 2006 - 16:39 Der er 15 kommentarer og
1 løsning

2 counts i samme forespørgsel

hejsa

Jeg har følgende forespørgsel i mit script

$types = array('E' => 'Job Seeker', 'C' => 'Company', 'S' => 'Sub-Contractor', 'D' => 'Consultant', 'P' => 'Supplier') ;
    $sql = "SELECT type, count(*) as 'cnt' FROM contacts GROUP BY type" ;
    $rs = $conn->query($sql) ;

    while ($row = $conn->fetcharray($rs)) {
        $template->assign_block_vars('type_row', array(
            'CC_TYPE' => $types[$row['type']],
            'CC_CNT' => $row['cnt']
            ));
        }

Dette giver et output som ser sådant her ud :
Breakdown of Members by Type
Member Type No.
Company 16 
Consultant 5 
Job Seeker 42 
Supplier 5 
Sub-Contractor 10 


Det jeg nu gerne vil er at der skal laves en count mere i forespørgslen, som tæller på følgende felt "pay_end_date" (dette felt indeholder udløbsdato)

dvs. der skal tælles antal hvor pay_end_data er STØRERE end dags dato (formatet er det der fåes fra time() komandoen.... )

der tilføjes således en ekstra variabel i mit udtræks arry ala :
  while ($row = $conn->fetcharray($rs)) {
        $template->assign_block_vars('type_row', array(
            'CC_TYPE' => $types[$row['type']],
            'CC_CNT' => $row['cnt'],
            'CC_CNT_PAY' => $row['pay']
            ));
        }

Men hvordan ser min sql streng ud når der er 2 counts og den ene skal tjekke på om en given værdi er stører ???
Avatar billede well_r Nybegynder
01. oktober 2006 - 17:53 #1
er ikke helt inde i count...men tror måske at dette vil virke?
$sql = "SELECT type, count(*) as 'cnt', COUNT(pay_end_date>now()) as antal_stoerre FROM contacts GROUP BY type" ;
Avatar billede well_r Nybegynder
01. oktober 2006 - 17:54 #2
det er ikke testet
Avatar billede cyberdude Nybegynder
02. oktober 2006 - 15:25 #3
tror du er på sporet, men den giver blot det tal som er i $row['cnt'] variablen 2 gange.... men den lister det dog uden fejl nu....
Avatar billede cyberdude Nybegynder
02. oktober 2006 - 15:34 #4
hmmm.... så vidt jeg kan hitte ud af så er der da ikke en funktion kaldet now() ?????
Avatar billede sw_red_6 Nybegynder
02. oktober 2006 - 15:37 #5
now() er en mysql funktion, men det kan godt være at du skal bruge noget andet. hvordan ser din pay_and_date ud? datatype, format..osv
Avatar billede cyberdude Nybegynder
02. oktober 2006 - 16:01 #6
det er i formatet time()
Avatar billede cyberdude Nybegynder
02. oktober 2006 - 16:07 #7
er det bare mit eller skal der ikke en where pay_end_date > ... ind et eller andet sted eller er det hvad der gøres i (pay_end_date>....) ???
Avatar billede sw_red_6 Nybegynder
02. oktober 2006 - 16:14 #8
hvis du sætter den where ind så bliver det kun de poster hvor pay_end_date er > dags dato
Avatar billede cyberdude Nybegynder
02. oktober 2006 - 16:20 #9
ja og det skal den jo ikke.... er jeg ude i at måtte lave 2 selects ?
Avatar billede kjulius Novice
03. oktober 2006 - 00:30 #10
Hvis jeg ellers har gennemskuet problemstillingen trods al den PHP kode, tror jeg, at jeg ville lave det som:

SELECT type, count(*) as 'cnt', SUM(CASE WHEN pay_end_date > NOW THEN 1 ELSE 0 END) as 'cnt_pay'
FROM contacts
GROUP BY type

SUM funktionen virker som en count, da den summerer enten 0 eller 1, afhængig af om kriteriet i CASE funktionen er opfyldt.
Avatar billede cyberdude Nybegynder
08. oktober 2006 - 13:11 #11
hmm så trækker den slet intet ud....

nogen anden ide / justering ?
Avatar billede cyberdude Nybegynder
08. oktober 2006 - 13:12 #12
satte en () efter NOW - og så kom udtrækket - ser korekt ud, men tester det lige...
Avatar billede cyberdude Nybegynder
08. oktober 2006 - 13:19 #13
sql'en ser nu sådant her ud :
$sql = "SELECT type, count(*) as 'cnt', SUM(CASE WHEN pay_end_date > NOW() THEN 1 ELSE 0 END) as 'cnt_pay' FROM contacts GROUP BY type";

men den skriver kun 0 i cnt_pay variablen eftergølgende trods der er forekomster... bytter jeg om på 1 og 0 i WHEN sektionen, hiver den det totale antal ud (altså også dem hvor pay_end_date er mindre....

lidt finjustering ??
Avatar billede cyberdude Nybegynder
08. oktober 2006 - 13:25 #14
kom til at tænke på om NOW() er i formatet unix timestamp - sec. siden 1970... ??

For hvis jeg istedet opretter en variabel inden sql'en indeholdende time() og kalder
SUM(CASE WHEN pay_end_date > $nutid THEN 1 ELSE 0 END)
så får jeg faktisk det korekte antal ud....

Det har sikkert ikke nogen nævneværdig effekt på udtrækstiden om jeg bruger det ene eller det andet, men kan det holdes i ren sql kode så er det vel det hurtigste....

Men so fare så funger det...

kjulius -> smid et svar og du får point...
Avatar billede kjulius Novice
08. oktober 2006 - 23:49 #15
Tak... :-)
Avatar billede kjulius Novice
08. oktober 2006 - 23:52 #16
I stedet for NOW() bruger du vel så bare UNIX_TIMESTAMP()?
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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