[PHP/MySQL] Occurences uit database tellen en weergeven

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Hoihoi, ik zit officieel met een probleem. Bijt me er al een uurtje of 2 op stuk maar kom er niet uit. Probleemomschrijving, database met de volgende vulling erin:

12,J1,G1,G1,12,15,12,R1,F1,F1,13,12 etcetc

Het enige wat ik nu wil is dat PHP telt hoeveel keer de 12 voorkomt, de 15 en F1 etcetc en dit weergeeft.... Simpel... Denk je...

Het gaat ook wel als je van te voren weet waar je op moet zoeken want ik had het volgende concept;

PHP:
1
2
3
4
5
6
7
8
9
while ($row = mysql_fetch_object($result)) {
$nr = $row->nr;
$area = substr($nr, 0, 2);
if ($area == 'G1') {
$G1 = $G1 + 1;
}
if ($area_q == '12') {
$twaalf = $twaalf + 1;
}


Je raad het al, dit wordt een beetje lang naarmate de mogelijkheden zich uit blijven breiden. Kortom ik wil dat men zelf kan aangeven waar men naar zoekt, dat ie daarmee aan de slag gaat en het vervolgens weergeeft. Dus ik denk we gooien er een array tegenaan enzo:

PHP:
1
2
3
4
5
6
7
8
9
$areafilter = "F1;G1;J1;R1;U1;11;12;13;14;15;16;17";
$areacode = explode (";", $areafilter);
    for($i = 0; $i < count($areacode); $i++) 
    {
        if ($area_q == $areacode[$i]) {
        $$area_name = "q".$area_q;
        $$area_name = $$area_name + 1;
        echo ${$qG1};
    }


Maargoed dat werkt dus allemaal voor geen meter met die variabele variabelen enzo, extra moeilijkheid is nog dat er cijferreeksen gebruikt worden die ik niet als strings kan gebruiken natuurlijk. Vandaar dat ik er die q voor wil plaatsen (q12, q15, qG1). Maargoed bovenstaande werkt dus niet en ik heb al tig mogelijkheden geprobeerd met {} en [] enzo maar het wil maar niet lukken...

Mis ik iets? Zit ik in de verkeerde richting te knoeien? 8)7

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:04
Euh, iets zegt me dat je toch wel een bagger datamodel hebt.
Waarom ga je die waarden comma-separated opslaan, en sla je niet iedere waarde in een apart record op (zoals het hoort)?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Zijn dit de vullingen van een kolom? In dat geval kun je toch gewoon iets doen als:
code:
1
SELECT kolom, count(kolom) as aantal GROUP BY kolom

Mocht het echter zo komma gescheiden erin staan, dan is het nodig tijd om hard over je db model na te gaan denken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
whoami schreef op donderdag 02 december 2004 @ 15:49:
Euh, iets zegt me dat je toch wel een bagger datamodel hebt.
Waarom ga je die waarden comma-separated opslaan, en sla je niet iedere waarde in een apart record op (zoals het hoort)?
Nah zo is het ook, wilde het even versimpelt uitleggen, het gaat om het idee...

Acties:
  • 0 Henk 'm!

Verwijderd

nl2dav schreef op donderdag 02 december 2004 @ 15:52:
[...]


Nah zo is het ook, wilde het even versimpelt uitleggen, het gaat om het idee...
En dit dan?
$areafilter = "F1;G1;J1;R1;U1;11;12;13;14;15;16;17";
$areacode = explode (";", $areafilter);
Maarreh, als het losse kolommen zijn dan gewoon een group by, lijkt me vrij standaard...

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:09

Dido

heforshe

Kleine aanvulling op de query van Janoz. Waarom zou dit geen oplossing zijn?
code:
1
SELECT kolom, count(kolom) as aantal FROM tabel GROUP BY kolom

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Dido schreef op donderdag 02 december 2004 @ 15:55:
Kleine aanvulling op de query van Janoz. Waarom zou dit geen oplossing zijn?
code:
1
SELECT kolom, count(kolom) as aantal FROM tabel GROUP BY kolom
Ehhh nee dat werkt niet echt, het zijn row entry's, sorry voor de verwarring. Elke row bevat zo'n categorie benaming. Het is niet een row met allemaal kolommen.

Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Verwijderd schreef op donderdag 02 december 2004 @ 15:55:
[...]


En dit dan?


[...]


Maarreh, als het losse kolommen zijn dan gewoon een group by, lijkt me vrij standaard...
Zijn het dus niet, zijn rows... En dat is de array van categorieen waar die op moet zoeken, kan het wel steeds handmatig invoeren steeds maar dat schiet niet op. Even vastgezet dus.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Ik snap eigenlijk geen kont van hoe je db er nu uitziet. Zou je misschien je tabel definities kunnen laten zien en/of een stukje data? Dan hoeven we ook niet zo te gokken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:09

Dido

heforshe

nl2dav schreef op donderdag 02 december 2004 @ 16:10:
Ehhh nee dat werkt niet echt, het zijn row entry's, sorry voor de verwarring. Elke row bevat zo'n categorie benaming. Het is niet een row met allemaal kolommen.
Ik snap niet meer wat je bedoelt. Als je een kolom heb waar je gegevens instaan werkt dit uitstekend.

Ik sluit me aan bij Janoz: geef eens de definitie van je tabel.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Tuurlijk, ik wil graag een oplossing voor me probleem ;) :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE qualifycounter (
  ID mediumint(5) NOT NULL auto_increment,
  callnr varchar(16) NOT NULL default '',
  datum varchar(5) NOT NULL default '',
  tijd varchar(5) NOT NULL default '',
  q_engcode varchar(4) NOT NULL default '',
  SubStatus tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (ID),
  UNIQUE KEY callnr (callnr)
) TYPE=MyISAM;

#
# Dumping data for table `qualifycounter`
#

INSERT INTO qualifycounter VALUES (1, '12000014258900', '18-08', '14:27', 'QDKU', 3);
INSERT INTO qualifycounter VALUES (2, '12000014267500', '28-08', '09:16', 'QDKU', 3);
INSERT INTO qualifycounter VALUES (3, '12000014268001', '29-08', '16:35', 'QBSC', 3);
INSERT INTO qualifycounter VALUES (4, '12000014269500', '29-08', '16:42', 'QBSC', 3);


Deze entries beginnen toevallig allemaal met 120000, maar er zijn er ook met 150000, G10000 etcetc ....Vandaar die substr van 2 in mijn eerdere code.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:09

Dido

heforshe

Dan werkt de oplossing die gegeven is toch uitstekend? (OK, je moet voor "kolom" wel even wat aanpassen).
Heb je het al geprobeerd?

(Select je substring, en Group daar ook op).

[ Voor 16% gewijzigd door Dido op 02-12-2004 16:22 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Hhheemmm wat jij bedoelt is waarschijnlijk iets in de trant van;

select count(callnr) as aantal FROM qualifycounter WHERE callnr like '12%%%'

Dan krijg ik inderdaad de waarde terug van hoe vaak 12xxxxxxxxxx terugkomt in de database maar dat is niet mijn eigenlijke probleem want hoe weet PHP nu dat ie hierna weer moet geven:

12 = 4394

Hmm heb wel een idee wat zou kunnen, maar even proberen dan... (as aantal hernoemen naar de searchstring met een letter ervoor en het hele zwikkie echo'en... Pff wat een gedoe)

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

pseudo
code:
1
2
3
4
5
6
7
select 
  substr(callnr,2) as ToCount,
  count(*) as Aantal
from 
  qualifycounter
group by 
  substr(callnr,2)


o.i.d. zou toch ook werken, hoef je niet moeilijk te gaan doen :?

[ Voor 5% gewijzigd door TheRookie op 02-12-2004 17:02 . Reden: +pseudo ;) ]


Acties:
  • 0 Henk 'm!

Verwijderd

TheRookie schreef op donderdag 02 december 2004 @ 17:00:
pseudo
code:
1
2
3
4
5
6
7
select 
  substr(callnr,2) as ToCount,
  count(*) as Aantal
from 
  qualifycounter
group by 
  substr(callnr,2)


o.i.d. zou toch ook werken, hoef je niet moeilijk te gaan doen :?
Ik zou er ook nog een distinct voorzetten
code:
1
2
3
4
5
6
7
select 
  distinct substr(callnr,2) as ToCount,
  count(*) as Aantal
from 
  qualifycounter
group by 
  substr(callnr,2)

[ Voor 23% gewijzigd door Verwijderd op 02-12-2004 17:18 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Ik heb geen idee waar die distinct voor zou moeten dienen. Hetgeen je hier met distinct probeert te bereiken wordt immers al door de group by afgehandeld.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Oke bedankt allen! Het was nog steeds niet zoals ik zelf in gedachten had (group by werkt namelijk niet omdat ik geen kolommen heb maar rows) maar ik ben toch op de goede weg geholpen. Tenminste, het werkt, of het efficient is weet ik niet omdat ik nu een zooitje queries achter elkaar moet doen maar het is maar niet anders dan... (vrees ik)

for the record, dit heb ik bedacht ;) ...:

PHP:
1
2
3
4
5
6
7
8
9
10
$selected_areas  = explode(";", $area_selection);
for ($i = 0;$i<sizeof($selected_areas);$i++)
{
$query_count = "select count(callnr) as q".$selected_areas[$i]." FROM qualifycounter WHERE callnr like '".$selected_areas[$i]."%%%' AND ID > '25000' AND DATUM = '".$datum_vandaag."';";
$result_count = mysql_query($query_count);
    if (mysql_result($result_count,0) > 0) 
    {
    $area_countline .= "<font color=\"yellow\">".substr (mysql_field_name($result_count,0), 1).":</font> ".mysql_result($result_count,0)." | ";
    }
}


En waar het voor is? Tis een logdatabase met daarin allemaal afgehandelde eehhh soort van orders, hij moet tellen hoeveel rows er van een bepaald type is afgehandeld op de huidige dag en dit vervolgens weergeven. Maar dat type is variabel en kan iemand dus ingeven middels een zoekopdracht (gescheiden door ; ) ...

In resultaten van 0 ben ik niet geintresseerd vandaar die if constructie.

Voor de kolombenoeming heb ik standaard een q gezet die ik er bij het resultaat weer vanaf haal, zo'n selected area kan een getal zijn (hoeft niet) en dat vind mysql niet leuk, een kolombenoeming van alleen cijfers :o

In de oude situatie trok ik alle gegevens uit de database van die dag en liet PHP de boel uitzoeken middels loopinstructies. Ik weet niet wat sneller is maar ben blij dat het in ieder geval werkt. Dan upgraden we maar een server :+

[ Voor 73% gewijzigd door nl2dav op 08-12-2004 13:15 ]


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Begrijp je uberhaupt wel wat een group by doet bij een query?
Resultaten zijn in elk geval altijd rows en dit is ook waar een group by betrekking op heeft. Met een group by geef je aan hoe een aggregated functie (COUNT, AVG) moet groeperen.
Voorbeeld in natuurlijke taal:
Geef mij hoe vaak de eerste twee tekens van een callnr voorkomt in de database, gegroepeerd per die eerste twee tekens van het callnr.
Dit is jouw vraag in natuurlijke taal, weliswaar alvast wat in de juiste vorm gegoten, maar toch.

Dit leidt dus tot de query zoals die door TheRookie is opgesteld, maar SUBSTR kun je vervangen door LEFT(callnr, 2).

Heb je toegang tot je database met een tool als phpmyadmin of mysqlcc o.i.d.? Want daarmee kun je prima queries testen voordat je er met php overheen gaat.

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
offtopic:
Om bij de variabele $i ééntje op te tellen kun je ook dit doen
[php]
$i++;
// ipv
$i = $i +1;
[/php]

Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:09
Jazeker, server is van mezelf ;-) ... Gebruik ook phpmyadmin, maar als ik dus die group by doe dan krijg kreeg ik unknown column in query...

Ik had geen haakjes gebruikt in mijn query zie ik nu vandaar dat ik unknown column in field list kreeg :/

Ik weet inderdaad niet precies wat group by doet, misschien moet ik daar dan toch eens meer over gaan lezen in de manual :X

En SKaah, ik gebruik $i++ toch?
(ow wacht hhmm ja, niet in het eerste gedeelte ;) )
Pagina: 1