Gjest Slettet+142 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 (endret) 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? Endret 27. juni 2006 av Slettet+142 Lenke til kommentar
-morten Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 (endret) 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 25. juni 2006 av -morten Lenke til kommentar
Gjest Slettet+142 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 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
-morten Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 Uhm. Nei 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 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 (endret) 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 Endret 25. juni 2006 av Slettet+142 Lenke til kommentar
-morten Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 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 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 oki.. hehe... då har eg totalt feil.. men vet ikkje helt om din funker heller.. 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... * Lenke til kommentar
-morten Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 $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 Lenke til kommentar
Gjest Slettet+142 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 (endret) 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 6382675[/snapback] damn... syntes du sa u ikkje var så god i mySQL, eg... 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"... ) Endret 25. juni 2006 av Slettet+142 Lenke til kommentar
Gjest Slettet+142 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 ehm.. begynner allerede no eg... tips på kordan å forkorte dette? skal jo ha nesten den samme koden på hovedkort, harddisk og resten av tingene i data'n... :S :O Lenke til kommentar
-morten Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 (endret) 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 25. juni 2006 av -morten Lenke til kommentar
Gjest Slettet+142 Skrevet 25. juni 2006 Del Skrevet 25. juni 2006 (endret) **<-- ...tester...tester... -->** ------resultat : --------- virket supert... --------------------------- thx for helping ----------------------------- --kjeder meg litt... måtte lage litt ekstra tegn i posten--- Endret 25. juni 2006 av Slettet+142 Lenke til kommentar
Torbjørn Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 umm... hva med mysql sin abs() funksjon? Lenke til kommentar
hockey500 Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 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 Lenke til kommentar
Gjest Slettet+142 Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 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? Lenke til kommentar
hockey500 Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 det kan det ikke såvidt jeg kan se, men han spurte, så jeg svarte. har ingenting med ditt problem å gjøre. det er løst uansett, er det ikke? førstnevnte løsning med bruk av MIN() og MAX() funker den.. Lenke til kommentar
Torbjørn Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 slik: select hva du vil from tabellnavn order by abs(pris - $ram) Lenke til kommentar
hockey500 Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 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 Skrevet 26. juni 2006 Del Skrevet 26. juni 2006 (endret) oki... dumt at eg ikkje skjønner ka ABS gjør då.. skjønner det ikkje helt... har ikkje akkurat tenkt å bruke den, pga. at eg har masse kode spesial-laget for den andre overnevnte måten... *føler meg litt dum...* -- hadde ikkje gjort noe om noen gidder å forklare ABS(x, y) for meg.. "step for step - how it works" Endret 26. juni 2006 av Slettet+142 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå