Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: query

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    2,929

    query

    ciao a tutti,

    ho una tabella del database con diversi record:
    20
    30
    40
    50
    60
    70
    ecc..

    io passo tramite url un numero tipo 66 come faccio a fare una query che mi passi il numero più vicino al 66 in questo caso 70 e quindi il suo id?? e soprattutto è possibile?


    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Non so se esiste una funzione SQL che fa questo, però puoi farlo con una query. Se la tua tabella è del tipo
    codice:
    id | valore
     1 | 10
     2 | 20
     3 | 70
    allora fai
    codice:
    SELECT id, valore, (ABS(valore - $input)) as diff FROM tabella 
    WHERE diff = (SELECT MIN(ABS(valore - $input)) FROM tabella)
    se il tuo database supporta le query nidificate (MySQL > 4.1 oppure PostgreSQL), altrimenti con un pò di php fai
    Codice PHP:
    $r mysql_query("SELECT MIN(ABS(valore - $input)) FROM tabella");
    $mindiff mysql_result($r00);
    $r mysql_query("SELECT id, valore FROM tabella WHERE (ABS(valore - $input)) = $mindiff");
    $row mysql_fetch_array($r); 

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    2,929
    Non ci ho capito nulla (me lo spieghi)

    io ho pensato invece di fare cosi, arrotondo per eccesso il numero
    ma non sò se possibile passare da 66 a 70??

    tu che ne pensi??


  4. #4
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Originariamente inviato da Rossella_75
    Non ci ho capito nulla (me lo spieghi)
    L'espressione abs(valore - $input), dove $input è la tua variabile presa da url, rappresenta la distanza tra il tuo input e i valori nella tabella, trovando il minimo trovi quello che cerchi tu.
    Il problema è che usando la funzione MIN(nomecampo) non puoi selezionare altri campi, pertanto devi usare questo valore come termine di confronto, se il database che usi supporta la sintassi delle query nidificate (ovvero query del tipo SELECT campo FROM tabella WHERE campo = (SELECT altrocampo FROM altratabella)), lo puoi fare con la prima query che ti ho scritto, altrimenti usando php, esegui la query interna, ti salvi il risultato e lo utilizzi come termine di paragone nella query esterna, così come ti ho scritto nel secondo esempio.

    Tutto chiaro?


    io ho pensato invece di fare cosi, arrotondo per eccesso il numero
    ma non sò se possibile passare da 66 a 70??
    Non puoi fare una cosa del genere, a meno che i tuoi numeri non abbiano tutti lo stesso numero di cifre.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    2,929
    allora ho fatto cosi

    codice:
    <?php 
    function calcolaprezzo($x, $y, $pezzi, $colori, $quadr, $perc) {
    	$area = $x * $y; // calcolol'area della superficie
    	$r = mysql_query("SELECT MIN(ABS(cmq - $area)) FROM serigrafia"); 
    	$mindiff = mysql_result($r, 0, 0); 
    	$r = mysql_query("SELECT id, cmq FROM serigrafia WHERE (ABS(cmq - $area)) = $mindiff"); 
    	$row = mysql_fetch_array($r);
    	if ( $quadr == "SI"){
    	$totale = "Questo è l'id $r AREA DELLA SUPERFICIE: $area CMQ, NUMERO DI PEZZI: $pezzi, N. COLORI: $colori, QUADRICROMIA: $quadr";
    	echo $totale;
    	}else {
    	$totale = "Questo è l'id $r AREA DELLA SUPERFICIE: $area CMQ, NUMERO DI PEZZI: $pezzi, N. COLORI: $colori";
    	echo $totale;
    	}
    }
    ?>
    e poi la richiamo cosi
    codice:
    <?php echo calcolaprezzo($_GET['base'],$_GET['altezza'],$_GET['qu'],$_GET['colore'],$_GET['checkbox'],$_GET['percentuale']); ?>
    e mi viene fuori questo
    codice:
    Questo è l'id Resource id #6 AREA DELLA SUPERFICIE: 40 CMQ, NUMERO DI PEZZI: 100, N. COLORI: 2

    questo è effettivamente l'id??

    Grazie mille

  6. #6
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Originariamente inviato da Rossella_75
    codice:
    Questo è l'id Resource id #6 AREA DELLA SUPERFICIE: 40 CMQ, NUMERO DI PEZZI: 100, N. COLORI: 2
    questo è effettivamente l'id??
    Non sei molto pratica di Mysql/php eh

    $r è un identificativo di risorsa, a partire da questa variabile puoi accedere ai campi che ti servono in due modi, se conosci "dove si trova" il dato che ti interessa (come ad esempio nella prima query) puoi usare
    Codice PHP:
    mysql_result($r00); 
    infatti nella prima query sapevo che mi avrebbe ritornato un solo campo quindi ho estratto la colonna 0 della riga 0, ne secondo caso potrebbero esserci più risultati (ad esempio se hai i valori 50 e 70 e il tuo input è 60) pertanto li puoi tirare fuori con
    Codice PHP:
    while ($row mysql_fetch_array($r)) {
      echo 
    "id ".$row['id']." valore ".$row['cmq']."
    "
    ;


  7. #7
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    2,929
    scusami in effetti non sono molto pratica, ma mi sto impegnando a studiare...
    ottengo quasi sempre l'id più vicino solo che il mio database è
    strutturato cosi
    id valore
    1 - 20

    2 - 25

    3 - 30

    4 - 35

    5 - 40

    6 - 45

    7 - 50

    8 - 60

    9 - 70

    10 - 80

    11 - 90

    12 - 100

    13 - 120

    14 - 140

    15 - 160

    16 - 180

    17 - 200

    18 - 225

    19 - 250

    20 - 275

    21 - 300

    22 - 350

    23 - 400

    24 - 450

    25 - 500

    26 - 750

    27 - 1000

    28 - 2000

    29 - 3500

    30 - 7000

    quindi ad esempio quando il valore è 5000 lui mi segnala l'ID 29 mentre dovrebbe andare per eccesso al l'id 30 è possibile?

    e poi se il numero è con la virgola ad esempio 527.575
    non fà nulla...

    come posso migliorare il codice.... Grazie mille
    codice:
    <?php 
    function calcolaprezzo($x, $y, $pezzi, $colori, $quadr, $perc) {
    	$area = $x * $y; // calcolo l'area della superficie
    	$r = mysql_query("SELECT MIN(ABS(cmq - $area)) FROM serigrafia"); 
    	$mindiff = mysql_result($r, 0, 0); 
    	$r = mysql_query("SELECT id, cmq FROM serigrafia WHERE (ABS(cmq - $area)) = $mindiff"); 
    	$row = mysql_fetch_array($r);
    	if ($quadr == "SI"){
    	$totale = "Questo è l'id $row[id] - AREA DELLA SUPERFICIE: $area CMQ, NUMERO DI PEZZI: $pezzi, N. COLORI: $colori, QUADRICROMIA: $quadr";
    	echo $totale;
    	}else {
    	$totale = "Questo è l'id $row[id] - AREA DELLA SUPERFICIE: $area CMQ, NUMERO DI PEZZI: $pezzi, N. COLORI: $colori";
    	echo $totale;
    	}
    }
    ?>
    Ancora grazie sei gentilissimo

  8. #8
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Originariamente inviato da Rossella_75
    29 - 3500
    30 - 7000

    quindi ad esempio quando il valore è 5000 lui mi segnala l'ID 29 mentre dovrebbe andare per eccesso al l'id 30 è possibile?
    E' quello che avevi chiesto tu, se invece vuoi un arrotondamento per eccesso devi cambiare le query in questo modo

    Codice PHP:
    $r mysql_query("SELECT MIN((valore - $input)) FROM tabella WHERE (valore - $input) >= 0");
    $mindiff mysql_result($r00);
    $r mysql_query("SELECT id, valore FROM tabella WHERE (valore - $input) = $mindiff");
    $row mysql_fetch_array($r); 
    Come ti ripeto l'ultima query può restituire anche più di un risultato nel caso in cui ci siano due record con lo stesso campo valore, se non è questo che vuoi dimmelo che va cambiata.

    e poi se il numero è con la virgola ad esempio 527.575
    non fà nulla...
    Non è che non fa nulla, semplicemente se nella tabella hai solo valori interi, lui cerca (7000 - 527.575) = 4472,425 nel campo valore e non trova nessuna corrispondenza.

    Tramite php puoi convertire il dato di input in intero con
    Codice PHP:
    $input = (int) $input// se è 527.575 diventa 527 
    in questo modo troverai sempre corrispondenze.


  9. #9
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    2,929
    diciamo che ci siamo, mi daresti un'altro input....
    non riesco a visualizzare il dato di una colonna (quella in grassetto) il nome della colonna scelta la passo sempre trammite url e nella funzione è la variabile $pezzi possoscrivere come ho scritto o è sbagliato?? (cosi non vedo nulla)
    codice:
    <?php 
    function calcolaprezzo($x, $y, $pezzi, $colori, $quadr, $perc) {
    	$area = $x * $y; // calcolo l'area della superficie
    	$area = (int) $area;
    	$r = mysql_query("SELECT MIN((cmq - $area)) FROM serigrafia WHERE (cmq - $area) >= 0"); 
    	$mindiff = mysql_result($r, 0, 0); 
    	$r = mysql_query("SELECT id, cmq FROM serigrafia WHERE (cmq - $area) = $mindiff"); 
    	$row = mysql_fetch_array($r);
    	if ($quadr == "SI"){
    	$totale = "Questo è l'id ".$row[id]." - ".$row[$pezzi]." - AREA DELLA SUPERFICIE: $area CMQ, NUMERO DI PEZZI: $pezzi, N. COLORI: $colori, QUADRICROMIA: $quadr";
    	echo $totale;
    	}else {
    	$totale = "Questo è l'id ".$row[id]." - Questa è la colonna scelta: ".$row[$pezzi]." - AREA DELLA SUPERFICIE: $area CMQ, NUMERO DI PEZZI: $pezzi, N. COLORI: $colori";
    	echo $totale;
    	}
    }
    ?>
    Grazie

  10. #10
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Quando fai una query select devi specificare i campi da recuperare dal database, in questo caso la query dice
    codice:
    SELECT id, cmq FROM serigrafia WHERE (cmq - $area) = $mindiff
    pertanto nel risultato che hai in $row non hai la colonna $pezzi, qualsiasi essa sia. Per averla devi cambiare la query in
    codice:
    SELECT id, cmq, $pezzi FROM serigrafia WHERE (cmq - $area) = $mindiff
    e avrai in $row[$pezzi] il dato che ti interessa.

    Occhio a non passare come parametro una colonna inesistente, altrimenti avrai un errore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.