Query laten kiezen uit een range
Ik heb een database met daarin 4 kolommen:
| blauw | groen | rood | text|
In de kolommen blauw, groen en rood staan percentages. Bijvoorbeeld:
blauw: 45, groen: 30, rood: 25
In de kolom text staat een bijbehorende text. Deze text is dus gekoppeld aan de drie percentages voor blauw, groen en rood.
Het gaat hier om een scoretabel, wanneer iemand dus vragen beantwoord heeft krijgt hij een overzicht met een taartdiagram. Hierin kan de kandidaat de score zien in percentages per kleur. Hieronder moet een uitleg/conclusie text komen te staan.
In de database heb ik 26 combinaties met bijbehorende texten staan. Maar deze dekken nooit alle mogelijkheden. (Het is geen optie om deze uit te breiden). Wat ik graag zou willen is een functie welke eerst bijvoorbeeld de blauwe rij afgaat naar het beste getal, daarna de rode rij en daarna de groene rij. Hierna blijft er dus 1 text over.
Kortom kan ik mijn Query aan de hand van het percentage zelf een keuze laten maken tussen een bepaalde range. Anders gezegt, ik bijvoorbeeld een score bij blauw van 26. Is er een query/script dat dan de beste keus maakt uit bijvoorbeeld, 20, 25, 30, 45, 50, 55, 65, 70.
Als ik dat heb, dan kan ik daarna dat script splitsen in naar rood (van degen die overblijven uit de query) en daarna toepassen op groen (van degene die weer overblijven uit de query van rood).
Is dit duidelijk? UItleg had misschien simpeler gekunt, maar ik hoop dat het zo duidelijk is.
bvd,
Bram
Moet ik binnen het benodigde script eerst afronden? Of is er een script wat binnen een range zelf afrond naar de best mogelijke getal?
$invoer = 51;
$richtgetal = 45;
$rangeblauw = range(45,100);
if (in_array($invoer,$rangeblauw))
{ $rangeblauw_definitief = $richtgetal;
print "$rangeblauw_definitief";
}
Als het richtgetal 45 is dan heeft deze een range van 45 tot 100. Wanneer ik daarna bijvoorbeeld 51 invoer dan komt er als definitieve blauw toch 45 uit. Ik moet nu alleen uitvinden hoe ik de range variabel maak. Het richtgetal moet ook uit de databse gehaalt worden. En voor elk richtgetal moet hij dus dit berekenen met een variabele range...
Gewijzigd op 01/01/1970 01:00:00 door Bram
Kortom het richtgetal hoeft alleen maar 45, 40, 35, 30, 25 en 20 te zijn.
Bij 45 moet het een range zijn van 45 tot 100 en bij 20 moet het een range worden van 20 tot 0.
Andere getallen moeten een range hebben van bijvoorbeeld (bij 35) een range van 37 tot 23.
Ik wil alleen weten of jullie het nog verder kunnen versimpelen en vereenvoudigen, zodat ik meer dingen variabel kan maken:
$invoer = $PERCENTAGE_Blauw;
$rangeblauw45 = range(43,100);
$rangeblauw40 = range(38,42);
$rangeblauw35 = range(33,37);
$rangeblauw30 = range(28,32);
$rangeblauw25 = range(24,27);
$rangeblauw20 = range(0,23);
if (in_array($invoer,$rangeblauw45))
{$rangeblauw_definitief = 45;}
if (in_array($invoer,$rangeblauw40))
{$rangeblauw_definitief = 40;}
if (in_array($invoer,$rangeblauw35))
{$rangeblauw_definitief = 35;}
if (in_array($invoer,$rangeblauw30))
{$rangeblauw_definitief = 30;}
if (in_array($invoer,$rangeblauw25))
{$rangeblauw_definitief = 25;}
if (in_array($invoer,$rangeblauw20))
{$rangeblauw_definitief = 20;}
print "$rangeblauw_definitief";
Zoals jullie zien heb ik voor elk richt getal (rangeblauw[cijfer]) een vaste range staan. Deze 6 richtgetallen en de bijbehorende ranges zijn ook vast (in tegenstelling van wat ik in eerdere posts beweer).
Nu is het alleen de vraag of ik deze stukje kan vervangen in een array:
$rangeblauw20 = range(0,23);
en
if (in_array($invoer,$rangeblauw20))
{$rangeblauw_definitief = 20;}
Ik heb nu bijvoorbeeld een uitkomst van: 26% blauw, 26% rood en 48% groen.
Maar nu krijg ik dus 1 getal voor blauw er uit. 25%.
Nu selecteer ik uit de database alles van rood wat een koppeling heeft met (afgeronde) 25% blauw:
$queryrood =
"SELECT * FROM texten WHERE blauw = '$rangeblauw_definitief'";
$resultrood = mysql_query($queryrood) or die(mysql_error());
while ($rowrood = mysql_fetch_array($resultrood))
{print "$rowrood[rood]<br>";}
Ik krijg hier nu 4 getallen uit (opties in de database bij 25% blauw):
40, 35, 30 en 45.
Mijn uitkomst voor rood was dus (ook) 26%. Deze zit niet bij de uitkomsten uit de query. Ik moet nu een script hebben wat geheel variabel degene kiest welke het dichtste bij 26% ligt. Kortom van alle uitkomste de beste optie uitkiezen. Ik kan dit niet oplossen met eerdergenoemtscript (voor blauw) aangezien ik dan 25% als uitkomst krijg. Deze combinatie (25% blauw en 25% rood) staat niet in de database. Maar zoals je uit de query kan lezen staat er wel een combinatie in van 25% blauw en 30% rood!. Dit zou de beste combinatie zijn.
Hoe krijg ik het systeem nu zo ver dat hij bij deze dan ook 30% pakt. Kortom als ik 4 uitkomsten heb, hoe maak ik dan een systeem wat dat getal pakt wat het dichtste in de buurt komt van mijn richtgetal/input voor rood?
Mijn uitkomsten zijn:
Blauw: 26%
Rood: 26%
Groen: 48%
Het script is nu:
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
67
68
69
70
71
72
73
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
67
68
69
70
71
72
73
<?php
$invoer = $PERCENTAGE_Blauw;
$range45 = range(43,100);
$range40 = range(38,42);
$range35 = range(33,37);
$range30 = range(28,32);
$range25 = range(24,27);
$range20 = range(0,23);
if (in_array($invoer,$range45))
{$rangeblauw_definitief = 45;}
if (in_array($invoer,$range40))
{$rangeblauw_definitief = 40;}
if (in_array($invoer,$range35))
{$rangeblauw_definitief = 35;}
if (in_array($invoer,$range30))
{$rangeblauw_definitief = 30;}
if (in_array($invoer,$range25))
{$rangeblauw_definitief = 25;}
if (in_array($invoer,$range20))
{$rangeblauw_definitief = 20;}
$queryrood = "SELECT * FROM texten WHERE blauw = '$rangeblauw_definitief'";
$resultrood = mysql_query($queryrood) or die(mysql_error());
$richtgetal_rood = $PERCENTAGE_Rood;
$range5 = range($richtgetal_rood-5,$richtgetal_rood+5);
$range10 = range($richtgetal_rood-10,$richtgetal_rood+10);
$range15 = range($richtgetal_rood-15,$richtgetal_rood+15);
$range20 = range($richtgetal_rood-20,$richtgetal_rood+20);
while ($rowrood = mysql_fetch_array($resultrood)) {
if (in_array($rowrood['rood'],$range5))
{$rangerood_definitief = $rowrood['rood'];}
if(empty($rangerood_definitief)) {
if (in_array($rowrood['rood'],$range10))
{$rangerood_definitief = $rowrood['rood'];}
if(empty($rangerood_definitief)) {
if (in_array($rowrood['rood'],$range15))
{$rangerood_definitief = $rowrood['rood'];}
if(empty($rangerood_definitief)) {
if (in_array($rowrood['rood'],$range20))
{$rangerood_definitief = $rowrood['rood'];}
}
}
}
}
$rangegroen_definitief = 100 - $rangerood_definitief - $rangeblauw_definitief;
// TEXT SELECTIE
$querytext= "SELECT * FROM texten WHERE blauw = '$rangeblauw_definitief' AND rood = '$rangerood_definitief'";
$resulttext= mysql_query($querytext) or die(mysql_error());
$rowtext=mysql_fetch_array($resulttext);
print "$rowtext[text]";
?>
$invoer = $PERCENTAGE_Blauw;
$range45 = range(43,100);
$range40 = range(38,42);
$range35 = range(33,37);
$range30 = range(28,32);
$range25 = range(24,27);
$range20 = range(0,23);
if (in_array($invoer,$range45))
{$rangeblauw_definitief = 45;}
if (in_array($invoer,$range40))
{$rangeblauw_definitief = 40;}
if (in_array($invoer,$range35))
{$rangeblauw_definitief = 35;}
if (in_array($invoer,$range30))
{$rangeblauw_definitief = 30;}
if (in_array($invoer,$range25))
{$rangeblauw_definitief = 25;}
if (in_array($invoer,$range20))
{$rangeblauw_definitief = 20;}
$queryrood = "SELECT * FROM texten WHERE blauw = '$rangeblauw_definitief'";
$resultrood = mysql_query($queryrood) or die(mysql_error());
$richtgetal_rood = $PERCENTAGE_Rood;
$range5 = range($richtgetal_rood-5,$richtgetal_rood+5);
$range10 = range($richtgetal_rood-10,$richtgetal_rood+10);
$range15 = range($richtgetal_rood-15,$richtgetal_rood+15);
$range20 = range($richtgetal_rood-20,$richtgetal_rood+20);
while ($rowrood = mysql_fetch_array($resultrood)) {
if (in_array($rowrood['rood'],$range5))
{$rangerood_definitief = $rowrood['rood'];}
if(empty($rangerood_definitief)) {
if (in_array($rowrood['rood'],$range10))
{$rangerood_definitief = $rowrood['rood'];}
if(empty($rangerood_definitief)) {
if (in_array($rowrood['rood'],$range15))
{$rangerood_definitief = $rowrood['rood'];}
if(empty($rangerood_definitief)) {
if (in_array($rowrood['rood'],$range20))
{$rangerood_definitief = $rowrood['rood'];}
}
}
}
}
$rangegroen_definitief = 100 - $rangerood_definitief - $rangeblauw_definitief;
// TEXT SELECTIE
$querytext= "SELECT * FROM texten WHERE blauw = '$rangeblauw_definitief' AND rood = '$rangerood_definitief'";
$resulttext= mysql_query($querytext) or die(mysql_error());
$rowtext=mysql_fetch_array($resulttext);
print "$rowtext[text]";
?>
De uitkomst is nu
Blauw 25% Rood: 30% en Groen 45%
Deze komt overeen met een text uit de database!
Kortom so far, so good. Maar kunnen jullie dit voor mij optimaliseren?
Gewijzigd op 01/01/1970 01:00:00 door Bram
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
switch($invoer)
{
case $invoer <= 23 :
$rangerood_definitief = 20;
break;
case $invoer >= 24 && $invoer <= 27 :
$rangerood_definitief = 25;
break;
case $invoer >= 28 && $invoer <= 32 :
$rangerood_definitief = 30;
break;
case $invoer >= 33 && $invoer <= 37 :
$rangerood_definitief = 35;
break;
case $invoer >= 38 && $invoer <= 42 :
$rangerood_definitief = 40;
break;
case $invoer >= 43 :
$rangerood_definitief = 45;
break
default :
$rangerood_definitief = 45;
}
?>
switch($invoer)
{
case $invoer <= 23 :
$rangerood_definitief = 20;
break;
case $invoer >= 24 && $invoer <= 27 :
$rangerood_definitief = 25;
break;
case $invoer >= 28 && $invoer <= 32 :
$rangerood_definitief = 30;
break;
case $invoer >= 33 && $invoer <= 37 :
$rangerood_definitief = 35;
break;
case $invoer >= 38 && $invoer <= 42 :
$rangerood_definitief = 40;
break;
case $invoer >= 43 :
$rangerood_definitief = 45;
break
default :
$rangerood_definitief = 45;
}
?>
Wat je daarnaast in die laatste while doet, is ook erg onlogisch. Waarom gebruik je allereerst een while? Er is toch maar 1 resultaat? En het controleren met die if-jes is ook nutteloos aangezien je $rangerood_definitief in elke situatie toch de waarde van $row['rood'] geeft.
En daarnaast natuurlijk een klein schoonheidsfoutje: die quotes horen niet om die variabele bij je print commando, en gebruik liever echo ipv print:
Verder is er bij rangerood niet altijd 1 uitkomst, soms zijn er 2 mogelijkheden, soms 3, 4,5 of 6. Met die range bij die if-jes zoek ik het getal (1 van de uitkomsten van rood uit de database) wat het dichste bij het Percentagerood ligt (je invoer).
Groen is daarna logischerwijs een resultant van 100 - rangeblauw - rangerood. en dus blijft er NA het selecteren van rood pas 1 mogelijkheid over. (Zie hieronder voor een database voorbeeld met blauw 25)
| blauw | groen | rood | text|
25 45 30 blabla
25 40 35 blabla2
25 35 40 blabla3
25 30 45 blabla4
Met mijn invoer Blauw: 26% Groen 48% Rood: 26% kiest het script nu, Blauw 25%, Groen, 45% en rood 30%.
Dit omdat 45 maximum is (ook al haal je bijv 10, 80, 10) 30% is een resultant van 100 - 25 - 45.
En over de echo/print. Ik gebruik altijd echo of print met quotes. Als daarbinnen een query rowvariabele voorkomt dan zet ik deze binnen de "" en tussen de [] zet ik dan geen '' meer neer. Wat is het voordeel/nadeel daarvan en wat is het verschil tussen echo en print?