Array vullen in een loop
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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++;
}
?>
$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?
- $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 :
Zie: http://www.w3resource.com/sql/select-statement/queries-with-distinct.php
Gewijzigd op 03/09/2015 11:30:35 door DavY -
De hoofdletters heb ik gedaan voor hier, ik kan namelijk de echte namen hier niet posten.
Gewijzigd op 03/09/2015 13:03:57 door DavY -
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
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
EN natuurlijk ook bedankt aan Davy, jouw voorzet zat behoorlijk in de goede richting...
En Bo, jij ook bedankt voor het meedenken.
thnx All!!
Backtick = ` (naast de 1).
Die zijn echt niet nodig. En zo wel: dan doe je iets fout.
Wat is er dan mis met backticks ?
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.
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
thnx voor de extra uitleg... ik zal het ff aanpassen :)
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.
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.
Code (php)
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
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`
;
`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);
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!
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.
Let wel dat dan 5 x die tabel doorlopen moet worden.
Gebaseerd op bovenstaande
Code (php)
1
2
3
4
5
6
7
8
9
10
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
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
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.