sql: welke waarde is het kortste bij
Niels Beckers
14/04/2007 10:50:00Hallo,
Al sorry voor de slechte titel maar ik wist niets anders te verzinnen.
Mijn vraag gaat als volgt.
Ik heb in de database enkele rijen staan nu wil ik (adhv) een script kijken welke rij het korste bij is bij de waarde die ik heb ingevoerd.
Een voorbeeld
--database--
id - waarde
1 - 500 -
2 - 1000 -
stel ik typ in de form in 800 dan zou ik naar de rij met id 2 moeten gaan omdat dat het kortste bij ligt.
Mijn vraag is nu: Hoe selecteer ik de waarde die het kortste bij ligt?
Niels
Al sorry voor de slechte titel maar ik wist niets anders te verzinnen.
Mijn vraag gaat als volgt.
Ik heb in de database enkele rijen staan nu wil ik (adhv) een script kijken welke rij het korste bij is bij de waarde die ik heb ingevoerd.
Een voorbeeld
--database--
id - waarde
1 - 500 -
2 - 1000 -
stel ik typ in de form in 800 dan zou ik naar de rij met id 2 moeten gaan omdat dat het kortste bij ligt.
Mijn vraag is nu: Hoe selecteer ik de waarde die het kortste bij ligt?
Niels
PHP hulp
09/01/2025 06:12:26TJVB tvb
14/04/2007 11:21:00Ik denk dat het makkelijkste is om de eerste rij te selecteren die eronder ligt en de eerste die erboven ligt.
Ik hoop dat dit duidelijk is en werkt zoals je bedoelt
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$rij; //hier komt de juiste rij in te staan
$aantal = 800; //vull maar in
$query = "SELECT * FROM tabel WHERE waarde <=".$aantal." ORDER BY waarde DESC LIMIT 1";
$onder = mysql_fetch_array(mysql_query($query));
$query = "SELECT * FROM tabel WHERE waarde >=".$aantal." ORDER BY waarde LIMIT 1";
$boven = mysql_fetch_array(mysql_query($query));
if( ($boven-$aantal) >( $aantal-$onder) ){
$rij = $onder; //de rij onder $aantal ligt het dichtste bij
}else{
$rij = $boven; //de rij boven $aantal ligt het dichtste bij
}
//wat je er verder mee wilt doen
?>
$rij; //hier komt de juiste rij in te staan
$aantal = 800; //vull maar in
$query = "SELECT * FROM tabel WHERE waarde <=".$aantal." ORDER BY waarde DESC LIMIT 1";
$onder = mysql_fetch_array(mysql_query($query));
$query = "SELECT * FROM tabel WHERE waarde >=".$aantal." ORDER BY waarde LIMIT 1";
$boven = mysql_fetch_array(mysql_query($query));
if( ($boven-$aantal) >( $aantal-$onder) ){
$rij = $onder; //de rij onder $aantal ligt het dichtste bij
}else{
$rij = $boven; //de rij boven $aantal ligt het dichtste bij
}
//wat je er verder mee wilt doen
?>
Ik hoop dat dit duidelijk is en werkt zoals je bedoelt
Quote:
Edit typo's
Gewijzigd op 01/01/1970 01:00:00 door TJVB tvb
Joren de Wit
14/04/2007 12:46:00Beetje omslachtig, het kan waarschijnlijk ook wel gewoon in 1 query:
Wat deze query doet is het berekenen van de absolute waarde van het verschil tussen de waarde in de tabel en de waarde die de gebruiker invoert. Vervolgens oplopend sorteren op die waarde. Met de LIMIT zorg je dat er maar 1 waarde weergegeven wordt.
Enige nadeel van deze query is, dat als de gebruiker een waarde invoert die precies tussen twee andere waarden ligt, er maar 1 waarde weergegeven wordt. Dat zal dan de waarde met het laagste id zijn.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
id,
waarde,
ABS(800-waarde) AS testvalue
FROM
tabel
ORDER BY
testvalue ASC
LIMIT 1
id,
waarde,
ABS(800-waarde) AS testvalue
FROM
tabel
ORDER BY
testvalue ASC
LIMIT 1
Wat deze query doet is het berekenen van de absolute waarde van het verschil tussen de waarde in de tabel en de waarde die de gebruiker invoert. Vervolgens oplopend sorteren op die waarde. Met de LIMIT zorg je dat er maar 1 waarde weergegeven wordt.
Enige nadeel van deze query is, dat als de gebruiker een waarde invoert die precies tussen twee andere waarden ligt, er maar 1 waarde weergegeven wordt. Dat zal dan de waarde met het laagste id zijn.