Array vullen in een loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

E. de Groot

E. de Groot

03/09/2015 10:43:30
Quote Anchor link
Hoi,

Ik heb een bepaalde loop.

mysql_query met een DISTINCT. Hierin worden unieke gebruikers geselecteerd.
Vervolgens komt er een while loop voor die output. Daarin wordt wordt dan per gebruiker
gekeken hoeveel resultatie diegene heeft.
Omdat ik dit resultaat niet kan sorteren, wil ik in de while loop eerst alles in een array zetten
en dat dan sorteren en pas dan echoeen.

Ik heb echter geen idee hoe je dat dan doet...

De code is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$query_names
= mysql_query("select DISTINCT NAAM FROM TABLE ORDER BY NAAM ASC");

    $i = 0;
    while ($totaal = mysql_fetch_array($query_names)) {
        
        $ad = $totaal['naam'];
        $resultaat = mysql_query("SELECT * FROM NAAM WHERE naam = '$ad'");
        $query_all = mysql_fetch_array($resultaat);        
        $cijfertotaal = mysql_num_rows($resultaat);

[
hier moet een array opgebouwd worden]
Die moet dan gevuld worden met NAAM en AANTAL

$i++;
}

?>


Wellicht kan het geheel helemaal anders maar mijn kennis is helaas ook maar enigzins beperkt...
Misschien dus 1 sql query? Het is dus 1 tabel. Uiteindelijk moet ik dan weten hoevaak een naam een record heeft.
en sortering moet op het aantal zijn zodat de hoogste bovenaan staat.

Iemand een idee?
 
PHP hulp

PHP hulp

19/04/2024 13:05:06
 
DavY -

DavY -

03/09/2015 11:18:55
Quote Anchor link
- $query_names deugt niet (kolumn + tabel is in hoofdletters)
- $i is niet nodig
- $totaal['naam'] slaat nergens op, je gebruikt namelijk DISTINCT
- 2de query in while() ? Je haalt de namen toch al op in de eerste
- nog een fetch_array in while() die nergens op slaat
- Hetzelfde geldt voor num_rows
- mysql() is dood, dus denk aan mysqli()

DISTINCT :
Afbeelding
Zie: http://www.w3resource.com/sql/select-statement/queries-with-distinct.php
Gewijzigd op 03/09/2015 11:30:35 door DavY -
 
E. de Groot

E. de Groot

03/09/2015 12:41:51
Quote Anchor link
Nou... tis wel nodig want in de eerste query haal ik de namen op en in de 2de tel ik hoevaak ze voorkomen...

De hoofdletters heb ik gedaan voor hier, ik kan namelijk de echte namen hier niet posten.
 
DavY -

DavY -

03/09/2015 12:55:49
Quote Anchor link
N.v.t. Ik lette niet goed op.
Gewijzigd op 03/09/2015 13:03:57 door DavY -
 
E. de Groot

E. de Groot

03/09/2015 12:57:44
Quote Anchor link
in het tabel wordt alles opgeslagen. Elke naam kan 1 of wel 100 x voorkomen.
Dus ik moet dan van elk unieke individu weten hoevaak ze voorkomen.
Dat is het resultaat wat ik eruit wil halen en dan dus gesorteerd op aantal
 
Bo Ter Ham

Bo Ter Ham

03/09/2015 13:01:41
Quote Anchor link
Kun je niet iets met een GROUP BY doen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT naam, count(*) AS aantal,
FROM TABLE
GROUP BY naam
ORDER BY aantal DESC
 
DavY -

DavY -

03/09/2015 13:07:42
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT DISTINCT(naam), COUNT(DISTINCT(naam))
FROM tabelnaam
ORDER BY naam ASC
 
E. de Groot

E. de Groot

03/09/2015 13:19:31
Quote Anchor link
das dan wel een mooie korte regel... hij sorteert alleen niet op de aantallen...
Maar ik krijg voor alsnog met beiden geen output...

Toevoeging op 03/09/2015 13:20:41:

@Davy, hoe kan ik met die van jou aantallen echoen dan?
Hoewel ik die van Bo ook nog niet snap... maar ik neem aan gewoon met Aantal
 

03/09/2015 14:59:06
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
  `naam`,
  COUNT(`naam`) AS `aantal`
FROM
  `<tabel>`
GROUP BY
  `naam`
ORDER BY
  COUNT(`naam`) DESC
 
E. de Groot

E. de Groot

03/09/2015 15:09:40
Quote Anchor link
Yes! in 1 x Antje!! TOP!! Dat is hem en die doet precies wat ik wil.... te gek he!

EN natuurlijk ook bedankt aan Davy, jouw voorzet zat behoorlijk in de goede richting...
En Bo, jij ook bedankt voor het meedenken.

thnx All!!
 
Eddy E

Eddy E

03/09/2015 21:16:26
Quote Anchor link
En nu nog even de backticks verwijderen.
Backtick = ` (naast de 1).

Die zijn echt niet nodig. En zo wel: dan doe je iets fout.
 

03/09/2015 21:44:27
Quote Anchor link
Wat is er dan mis met backticks ?
 
Johan K

Johan K

03/09/2015 22:50:11
Quote Anchor link
@Antje
Heel netjes, ik had daar niet opgekomen.

Eddy E op 03/09/2015 21:16:26:
En nu nog even de backticks verwijderen.
Backtick = ` (naast de 1).

Die zijn echt niet nodig. En zo wel: dan doe je iets fout.

je kan het doen, hoeft niet. Deze zijn alleen nodig als een kolom naam gelijk is aan een mysql/postgresql/oracle, etc.. "reserved keywords" zoals "group" of "select". Dit kan je dan "escapen" met backticks zodat hij het dan wel als kolom pakt. Maar als dit speelt in jouw database, is jouw db structuur niet goed. He is gewoon een "fool proof" mode, en zou je dus eigenlijk niet nodig moeten hebben.

Maar antje weet natuurlijk niet hoe jouw DB structuur eruit ziet en serveert hem zoals het hoort, werkende ongeacht de structuur.
Gewijzigd op 03/09/2015 22:52:17 door Johan K
 
E. de Groot

E. de Groot

04/09/2015 11:39:34
Quote Anchor link
thnx voor de extra uitleg... ik zal het ff aanpassen :)
 

04/09/2015 11:48:37
Quote Anchor link
Backticks gebruiken vind ik gewoon een good practice, waarbij ik ook wel weet dat het lang niet altijd nodig is. Het vertelt je database expliciet het onderscheid tussen eigen namen en reserved keywords, dan hoeft die het niet te gokken. De opmerking dat ik dan iets niet goed doe slaat nergens op. Als er een reden is om een kolom `left` te noemen zodat daarmee duidelijk is wat de inhoud is, zoals bij modified preordered tree traversal dan moet een sql parser niet in de problemen komen en zijn backticks noodzakelijk. Stel dat je een class hebt die je queries voor je bouwt, dan is het makkelijker om automatisch overal backticks aan toe te voegen, dan om voor iedere custom naam te checken of dat geen reserved keyword is. Daarbij bestaat altijd de kans dat een lijst met reserved keywords in de toekomst wordt uitgebreid, en met backticks hoef je dan niet je queries aan te passen. Soms worden queries gemakkelijk honderden regels lang, en dan is het niet leuk om die opnieuw te moeten door te spitten en te testen.
 
E. de Groot

E. de Groot

04/09/2015 16:01:18
Quote Anchor link
Ik heb toch nog een aanvullende vraag... kan ik in diezelfde query van An tje ook meerdere kolommen tellen waarbij de naam elke x bepalend is voor hoeveel?

naam prod best verk
jan x
piet x
jan x
jan x
klaas x
klaas x

Is het dus ook mogelijk om te gaan tellen hoeveel prod, best en verk Jan heeft en hoeveel piet en klaas?

het mooiste zou dan ook zijn dat ik kan bepalen waarom er dan gesorteerd kan worden.
Kan dit dus met 1 MySQL query of moet ik dan echt meerdere hebben? Dit heb ik nu namelijk wel en dat werkt maar nu kan ik niet sorteren op de 2 andere kolommen.

Toevoeging op 04/09/2015 16:02:03:

Oh.. tabelletje komt niet goed over na posten. sorry!
maar de kruisjes staan wirwar onder de 3 kolommen verdeeld.
 

05/09/2015 16:59:16
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
SELECT
  `a`.`naam`   AS `Verkoper`,
  `b`.`prod`   AS `Product`,
  `c`.`n_prod` AS `Aantal`,
  `d`.`n_best` AS `Besteld`,
  `e`.`n_verk` AS `Verkocht`
FROM
  (
    ( SELECT DISTINCT
        `tabel`.`naam` AS `naam`
      FROM
       `tabel`
    ) AS `a`,
    ( SELECT DISTINCT
        `tabel`.`prod` AS `prod`
      FROM
        `tabel`
    ) AS `b`
  )
  LEFT JOIN
  ( SELECT
      `tabel`.`naam`        AS `naam`,
      `tabel`.`prod`        AS `prod`,
      COUNT(`tabel`.`prod`) AS `n_prod`
    FROM
      `tabel`
    GROUP BY
      `tabel`.`naam`,
      `tabel`.`prod`
  ) AS `c` ON (
    `a`.`naam` = `c`.`naam`
    AND `b`.`prod` = `c`.`prod`
  )
  LEFT JOIN
  ( SELECT
      `tabel`.`naam`        AS `naam`,
      `tabel`.`prod`        AS `prod`,
      SUM(IF(`tabel`.`best` = 'ja', 1, 0))
                            AS `n_best`
    FROM
      `tabel`
    GROUP BY
      `tabel`.`naam`,
      `tabel`.`prod`
  ) AS `d` ON (
    `a`.`naam` = `d`.`naam`
    AND `b`.`prod` = `d`.`prod`
  )
  LEFT JOIN
  ( SELECT
      `tabel`.`naam`        AS `naam`,
      `tabel`.`prod`        AS `prod`,
      COUNT(`tabel`.`verk`) AS `n_verk`
    FROM
      `tabel`
    GROUP BY
      `tabel`.`naam`,
      `tabel`.`prod`
  ) AS `e` ON (
    `a`.`naam` = `e`.`naam`
    AND `b`.`prod` = `e`.`prod`
  )
ORDER BY
  `a`.`naam`,
  `b`.`prod`
;


Toevoeging op 05/09/2015 17:02:33:

-- Tabelstructuur voor tabel `tabel`
CREATE TABLE IF NOT EXISTS `tabel` (
`naam` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL,
`prod` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL,
`best` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL,
`verk` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Gegevens worden geëxporteerd voor tabel `tabel`
INSERT INTO `tabel` (`naam`, `prod`, `best`, `verk`) VALUES
('jan', 'x', 'ja', 1),
('piet', 'y', 'ja', 1),
('jan', 'x', 'nee', 3),
('jan', 'x', 'ja', 2),
('klaas', 'z', 'ja', 2),
('klaas', 'x', 'nee', 4);
Gewijzigd op 05/09/2015 17:03:41 door
 
E. de Groot

E. de Groot

07/09/2015 15:21:39
Quote Anchor link
holy cr$p... dat is een enorme waslijst...
Dit is niet iets wat ik verwacht had... en nou moet ik het ook nog ombouwen tot mijn eigenscript...
Hier heb je vast flink tijd ingestoken... dank je wel daarvoor!!
ik ben echter wel bang dat het eventjes gaat duren. Dus excuses als ik niet snel reageer.

Echt dank je voor de moeite die je hebt genomen!
 

07/09/2015 19:54:53
Quote Anchor link
Voel je niet bezwaard, het was een aangenaam kwartiertje.
Ombouwen is bijna niet nodig; de data komt er uit zoals je hem hebben wilt.
Een zoek-en-vervang van `tabel` naar je eigen tabelnaam, en gewoon uitlezen naar een array via mysqli() zoals je al deed. Ben benieuwd of dit ook echt het antwoord is dat je zocht en waar je wat aan hebt.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/09/2015 21:22:39
Quote Anchor link
Waarom al die subqueries?
Let wel dat dan 5 x die tabel doorlopen moet worden.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
naam   prod    best     verk
jan     x
piet    x
jan             x
jan             x
klaas   x          
klaas                    x


Gebaseerd op bovenstaande
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
    naam,
    COUNT(*) aantal,
    SUM(prod = 'x') prod,
    SUM(best = 'x') best,
    SUM(verk = 'x') verk
FROM
    tabelnaam
GROUP BY naam
ORDER BY aantal DESC
Gewijzigd op 07/09/2015 21:23:58 door Ger van Steenderen
 

07/09/2015 21:44:43
Quote Anchor link
Minder leerzaam. :)

Met bovenstaande data hadden de laatste 3 kolommen ook in een enkele kolom met ENUM waarde gekund, en op die situatie had ik eerder geantwoord, waarna de aanvullende vraag kwam.

Mijn antwoord op de aanvullende vraag doet ook iets anders met andere data als uitgangspunt, het genereert eerst een carthesisch product van naam+product met in de daaropvolgende kolommen statistieken over numerieke en tekstuele data. Zo krijg je een totaaloverzicht en hoef je dat niet in PHP uit te programmeren. Dat probeer ik steeds na te streven: data bewerken/samenvoegen etc. in de database waar de data leeft. Zo min mogelijk in PHP. Nadat ik een keer een planningsmodule heb gebreid heb ik m'n lesje wel geleerd, wat is DateTime() in PHP traag!
Qua query performance zie ik geen probleem. MySQL is snel en ik mag aannemen dat de interne SQL optimizer z'n werk doet.
Gewijzigd op 07/09/2015 21:46:24 door
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.