Query laten kiezen uit een range

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bram

Bram

20/12/2006 11:51:00
Quote Anchor link
Hoi ik heb een vraagje,

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
 
PHP hulp

PHP hulp

07/11/2024 17:41:59
 
Bram

Bram

20/12/2006 12:21:00
Quote Anchor link
Moet ik binnen het benodigde script eerst afronden? Of is er een script wat binnen een range zelf afrond naar de best mogelijke getal?
 
Bram

Bram

20/12/2006 13:06:00
Quote Anchor link
Ik ben zelf even aan het proberen en ben bezig met dit script:

$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
 
Bram

Bram

20/12/2006 13:18:00
Quote Anchor link
Ik kom er net achter dat ik per kleur maar 6 verschillende ranges heb namelijk: 45, 40, 35, 30, 25 en 20. Deze 6 worden gecombineerd met dezelfde 6 voor rood en groen.

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.
 
Bram

Bram

20/12/2006 14:01:00
Quote Anchor link
Ok ik zit nu op een punt waar het script de goede kan op gaat!.

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;}
 
Bram

Bram

20/12/2006 14:40:00
Quote Anchor link
OK dit werk nu (los van het omzetten naar een logisch array oid).

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?
 
Bram

Bram

20/12/2006 16:02:00
Quote Anchor link
Ok ik hem nu wel een werken script denk ik:

Mijn uitkomsten zijn:

Blauw: 26%
Rood: 26%
Groen: 48%

Het script is nu:

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
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]";

?>


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
 
Joren de Wit

Joren de Wit

20/12/2006 23:55:00
Quote Anchor link
Welke waarde $rangeblauw_definitief moet krijgen zou ik niet op die manier doen. Je zou dit veel makkelijker met een switch op kunnen lossen:
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
<?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;
}

?>


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $rowtext['text'];
?>
 
Bram

Bram

21/12/2006 09:16:00
Quote Anchor link
Zou je mij uit kunnen leggen wat de voordelen zijn van de Switch ten opzichte van de range? (Weet ik namelijk niet).

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?
 



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.