Gå til innhold

henting av info et nærmest tall fra MySQL-db[LØST]


Gjest Slettet+142

Anbefalte innlegg

Gjest Slettet+142

hey...

 

kunne tenkt meg en "formel" for å hente en rad fra en MySQL-db som e nærmest et tall angitt i en variabel...

 

noen som har peiling på noe sånt? :blush:

Endret av Slettet+142
Lenke til kommentar
Videoannonse
Annonse

Kan ikke så mye sql, men min umiddelbare ide var å bruke MIN() og MAX() funksjonene for å hente det minste tallet som er større enn X og det største tallet som er mindre enn X, og så bruke PHP for å se hvilket av dem som er nærmest.

 

SELECT MIN(verdi) AS over FROM tabell WHERE verdi > X
SELECT MAX(verdi) AS under FROM tabell WHERE verdi < X

og så

$verdi = (($X - $under) > ($over - $X)) ? $over : $under;

Endret av -morten
Lenke til kommentar
Gjest Slettet+142

oki... ^^

skal prøve det...

 

men... tror eg fant uut en måte sjøl ved å:

SELECT *  FROM `zram` WHERE `pris` >= $ram AND `pris` <= $ram+300 ORDER BY `pris` ASC

og deretter


$antall = mysql_num_rows($sql_query);
$antall = $antall / 2;
for($i=1;$i<=$antall;$i++) {
   $rad = mysql_fetch_array($sql_result);
   if($i==$antall) {
       $ram_ = $rad['navn'];
       $ram_pris = $rad['pris'];
       $ram_update = $rad['dato'];
       $ram_type = $rad['type'];
       $ram_link = $rad['link'];
   }
}
echo "Ram-navn er: <b>$ram_</b>.<br>Pris er: <b>$ram_pris</b>.<br>   osv...";

 

dette skal vel gå an :S ?

Lenke til kommentar

Uhm. Nei :p

 

Det der gjør ikke det du spurte om, og inneholder også en feil.

 

Så vidt jeg skjønner, så prøver du her å hente alle priser som er mellom X og X+300, og så ta den prisen som ligger på midten av den lista du da får.

Spørsmålet ditt gikk ut på å finne den prisen som var nærmest X..

 

Dessuten vil $antall kunne være et desimaltall etter at du har delt det på to, og vil da aldri være det samme som $i.

Lenke til kommentar
Gjest Slettet+142

Hvis eg då gjør: ??

 


$antall = mysql_num_rows($sql_query);
$antall = (int) $antall / 2;
for($i=1;$i<=$antall;$i++) {
   $rad = mysql_fetch_array($sql_result);
   if($i==$antall) {
       $ram_ = $rad['navn'];
       $ram_pris = $rad['pris'];
       $ram_update = $rad['dato'];
       $ram_type = $rad['type'];
       $ram_link = $rad['link'];
   }
}
echo "Ram-navn er: <b>$ram_</b>.<br>Pris er: <b>$ram_pris</b>.<br>   osv...";

 

det eg skal gjøre e å skaffe EN rad fra tabellen...

skal liksom "sette sammen" en pc via en form :p

Endret av Slettet+142
Lenke til kommentar

må vel ha $antall = (int)($antall / 2); i så fall, men uansett - hvorfor skal du ha den midterste av det du henter ut? Det gir liksom ingen mening.

 

Er poenget at noen skriver inn en pris på RAM, og så skal du hente ut den RAM-en som er nærmest den prisen de har oppgitt? For i så fall gjør jo ikke koden din det i det hele tatt. Den jeg skrev øverst her gjør det.

Lenke til kommentar
Gjest Slettet+142

oki.. hehe...

 

då har eg totalt feil.. men vet ikkje helt om din funker heller.. :p

 

holder på å prøve den ut no, men skjønner ikkje helt kordan eg skal sette den sammen...

gidd u veilede meg? ^^

 

OT: * vet ikkje så mye om sql selv heller... :p *

Lenke til kommentar

$ram = 300; // kommer vel fra get/post

$sql0 = "SELECT pris FROM zram WHERE pris = $ram;
$sql1 = "SELECT MIN(pris) AS over FROM zram WHERE pris > $ram";
$sql2 = "SELECT MAX(pris) AS under FROM zram WHERE pris < $ram";

// Først sjekk om noe matcher akkurat prisen
$result = mysql_query($sql0);
if (mysql_num_rows($result)) { $pris = $ram; }

// Så finn de to nærmeste prisene
else {

 $result = mysql_query($sql1);
 $over = mysql_fetch_assoc($result);

 $result = mysql_query($sql1);
 $under = mysql_fetch_assoc($result);

 // Ta den prisen som er nærmest av de to
 $pris = (($ram - $under['under']) > ($over['over'] - $ram)) ? $over['over'] : $under['under'];
}

// Hent resten av infoen om den RAM-en med prisen vi har funnet.
// Dersom det er flere RAM-er med akkurat den prisen, så vil den bare ta én av dem
$sql4 = "SELECT * FROM zram WHERE pris = $pris LIMIT 1";
$result = mysql_query($sql4);
$rad = mysql_fetch_assoc($result);

$ram_ = $rad['navn'];
$ram_pris = $rad['pris'];
$ram_update = $rad['dato'];
$ram_type = $rad['type'];
$ram_link = $rad['link'];

echo "Ram-navn er: <b>$ram_</b>.<br>Pris er: <b>$ram_pris</b>.<br>   osv...";

 

Du får prøve den. Orker ikke lage tabeller osv for å teste, så det får du gjøre sjøl :p

Lenke til kommentar
Gjest Slettet+142
Skjult tekst: (Marker innholdet i feltet for å se teksten):

$ram = 300; // kommer vel fra get/post

$sql0 = "SELECT pris FROM zram WHERE pris = $ram;
$sql1 = "SELECT MIN(pris) AS over FROM zram WHERE pris > $ram";
$sql2 = "SELECT MAX(pris) AS under FROM zram WHERE pris < $ram";

// Først sjekk om noe matcher akkurat prisen
$result = mysql_query($sql0);
if (mysql_num_rows($result)) { $pris = $ram; }

// Så finn de to nærmeste prisene
else {

 $result = mysql_query($sql1);
 $over = mysql_fetch_assoc($result);

 $result = mysql_query($sql1);
 $under = mysql_fetch_assoc($result);

 // Ta den prisen som er nærmest av de to
 $pris = (($ram - $under['under']) > ($over['over'] - $ram)) ? $over['over'] : $under['under'];
}

// Hent resten av infoen om den RAM-en med prisen vi har funnet.
// Dersom det er flere RAM-er med akkurat den prisen, så vil den bare ta én av dem
$sql4 = "SELECT * FROM zram WHERE pris = $pris LIMIT 1";
$result = mysql_query($sql4);
$rad = mysql_fetch_assoc($result);

$ram_ = $rad['navn'];
$ram_pris = $rad['pris'];
$ram_update = $rad['dato'];
$ram_type = $rad['type'];
$ram_link = $rad['link'];

echo "Ram-navn er: <b>$ram_</b>.<br>Pris er: <b>$ram_pris</b>.<br>   osv...";

 

Du får prøve den. Orker ikke lage tabeller osv for å teste, så det får du gjøre sjøl :p

6382675[/snapback]

damn... :p

 

syntes du sa u ikkje var så god i mySQL, eg... :p:thumbup:

tusen takk for hjelp...

(håper u gidd å følge emnet sånn i tilfellet eg driter ut koden med å avansere den på "min måte"... :p)

Endret av Slettet+142
Lenke til kommentar
Gjest Slettet+142

ehm.. begynner allerede no eg... :p

 

tips på kordan å forkorte dette?

 

skal jo ha nesten den samme koden på hovedkort, harddisk og resten av tingene i data'n... :p :S :O

Lenke til kommentar

Gjør det om til en funksjon der du putter inn sql-tabell og pris, og får $rad som resultat.

 

Skjult tekst: (Marker innholdet i feltet for å se teksten):

// Funksjon for å hente noe basert på pris
function get_item($tabell, $onsket_pris) {

 $sql0 = "SELECT pris FROM $tabell WHERE pris = $onsket_pris LIMIT 1";
 $sql1 = "SELECT MIN(pris) AS over FROM $tabell WHERE pris > $onsket_pris";
 $sql2 = "SELECT MAX(pris) AS under FROM $tabell WHERE pris < $onsket_pris";

 // Først sjekk om noe matcher akkurat prisen
 $result = mysql_query($sql0);
 if (mysql_num_rows($result)) { $pris = $ram; }

 // Så finn de to nærmeste prisene
 else {

   $result = mysql_query($sql1);
   $over = mysql_fetch_assoc($result);

   $result = mysql_query($sql1);
   $under = mysql_fetch_assoc($result);

   // Ta den prisen som er nærmest av de to
   $pris = (($ram - $under['under']) > ($over['over'] - $ram)) ? $over['over'] : $under['under'];
 }

 // Hent resten av infoen om den dingsen med prisen vi har funnet.
 // Dersom det er flere dingser med akkurat den prisen, så vil den bare ta én av dem
 $sql4 = "SELECT * FROM $tabell WHERE pris = $pris LIMIT 1";
 $result = mysql_query($sql4);
 $rad = mysql_fetch_assoc($result);

 return $rad;
}



// Så kan vi bruke funksjonen på ram og alt det andre
$ram = get_item('zram', 300);

$ram_ = $ram['navn'];
$ram_pris = $ram['pris'];
$ram_update = $ram['dato'];
$ram_type = $ram['type'];
$ram_link = $ram['link'];

echo "Ram-navn er: <b>$ram_</b>.<br>Pris er: <b>$ram_pris</b>.<br>   osv...";

Endret av -morten
Lenke til kommentar
Gjest Slettet+142

**<-- ...tester...tester... -->**

 

------resultat : ---------

virket supert... :p

---------------------------

thx for helping

-----------------------------

 

--kjeder meg litt... måtte lage litt ekstra tegn i posten--- :p

Endret av Slettet+142
Lenke til kommentar
Gjest Slettet+142
jeg vet ikke hva abs() gjør i andre databaser, men mysql har en abs funksjon. Den gjør at hvis X har en negativ verdi vil den positive verdien bli returnert:

SELECT ABS(-4.20);

vil gi 4.20 som resultat

6388599[/snapback]

noen forslag til kode til kordan den kan brukes i mitt tilfelle? :dontgetit:

Lenke til kommentar

leste forresten feil ditt første innlegg, derfor svaret mitt ikke stemte helt. løsningen din funker selvsagt ja, når jeg tenker over det...

 

trådstarter:

$sql = "SELECT * FROM `tabell` ORDER BY ABS(pris - " . $ram . ") LIMIT 1";
$result = mysql_fetch_row(mysql_query($sql) or die(mysql_error()));

noe slikt

Lenke til kommentar
Gjest Slettet+142

oki... dumt at eg ikkje skjønner ka ABS gjør då.. :p

skjønner det ikkje helt... :p har ikkje akkurat tenkt å bruke den, pga. at eg har masse kode spesial-laget for den andre overnevnte måten... :p

 

:dontgetit: *føler meg litt dum...* :dontgetit:

 

-- hadde ikkje gjort noe om noen gidder å forklare ABS(x, y) for meg.. "step for step - how it works"

Endret av Slettet+142
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...