• Super User

    query su minimo di notti

    salve
    ho delle offerte che inserisco nel database che sono valide solo se ci sono tot numero di notti.
    Ad esempio, il prezzo di 60 euro al giorno e' valido solo se vengono effettuati dai 3 pernottamenti in poi.

    Il campo si chiama proprio numero_notti
    Nella query come devo indicare sta cosa?

    Mi spiego meglio, se effettuo la ricerca per 3 notti mi esce senza problemi il record, se invece effettuo la ricerca per 4 notti non mi esce e non capisco il motivo
    La durata delle notti la prendo da una select che ho nel form ed il campo si chiama $durata

    Potete aiutarmi?


  • ModSenior

    Ciao,
    puoi postare il codice utilizzato? Altrimenti è difficile dirti dov'è il problema.


  • Super User

    questa e' una delle clausole:
    [php]
    elseif($durata=="3"){
    $query_offerte .=" and (minimo_notti = 0 OR minimo_notti = 1 OR minimo_notti = 3)";
    }
    [/php]
    a me sembra che sta fatta bene, anzi forse potrei correggerla indicando che minimo_notti deve essere minore o uguale a $durata (che sarebbe il campo select del modulo)


  • ModSenior

    Ma il problema non la dava con 4 notti?


  • Super User

    con tutte, le prove le stavo facendo con il 4, cmq ora ho modificato cosi':
    [php]
    //Se la durata è compresa tra 1 e 14 (notti) mi dice che l'offerta da tirare fuori deve essere inferiore o uguale alla data di scadenza dell'offerta
    if($durata!="16"){
    $query_offerte .= "AND DATE_ADD(STR_TO_DATE('$arrivo', '%Y-%m-%d'), INTERVAL +$durata DAY) <= valida_fino ";
    }

    // Se la durata è uguale a 16 significa che vuole vedere tutte le offerte e quindi non ci sono filtri da applicare
    elseif($durata=="16"){
    $query_offerte .= "";
    }

    //Se la durata è diversa sia da 14 notti che da tutte le offerte (16) significa che deve mostrare tutte le offerte che hanno come minimo di notti un valore minore o uguale alla data scelta
    elseif(($durata!="14")and($durata!="16"))
    {
    $query_offerte .=" and (minimo_notti <= $durata)";
    }
    [/php]
    Per logica dovrebbe essere corretto cosi, no?


  • ModSenior

    No perchè al terzo if non ci arrivi mai, viene sempre soddisfatta una delle condizioni precedenti.


  • Super User

    e quindi devo mettere il terzo al primo posto?


  • ModSenior

    Si, se lo metti sopra funziona come vuoi tu.


  • Super User

    sicuro che non va in conflitto con gli altri 2?


  • ModSenior

    Il problema è cosa stai facendo più che altro, perchè hai 2 if che agiscono sul numero di notti mentre l'altra condizione utilizza un campo totalmente diverso.


  • Super User

    in che senso? tutti e 3 gli if tengono conto della durata.

    Spiego meglio:
    Ho un form composto dal campo "arrivo" dove inserisco la data tipo gg-mm-aaaa e sotto ho il campo "durata" dove ho questi valori

    1 notte (value 1)
    2 notti (value 2)
    3 notti (value 3)
    4 notti (value 4)
    5 notti (value 5)
    6 notti (value 6)
    7 notti (value 7)
    14 notti (value 14)
    tutte le offerte (value 16)

    quindi:

    • se l'utente sceglie il valore 16, non ci saranno filtri e mostrerà tutti i prezzi
    • se l'utente sceglie un valore diverso da 14 o da 16 vedrà tutti i prezzi, anche quelli che hanno un minimo di notti impostato, per esempio se l'offerta ha un minimo di notti pari a 3 e l'utente cerca un'offerta per 4 notti, questa offerta dovrà uscire
    • se l'utente cerca per 14 notti (questo ancora sto cercando di gestirlo) e magari in 14 notti sono comprese tue offerte settimanali come ad esempio una dal 2 al 9 agosto e l'altra dal 9 al 16 agosto, allora dovra' tirarmi fuori la somma delle 2 offerte...

  • Super User

    credo che cosi sia ancora migliore, facendo solo 2 condizioni
    [php]
    //Se la durata è compresa tra 1 e 14 (notti) mi dice che l'offerta da tirare fuori deve essere inferiore o uguale alla data di scadenza dell'offerta con il minimo di notti impostato
    if($durata!="16"){
    $query_offerte .= " and (minimo_notti <= $durata) AND DATE_ADD(STR_TO_DATE('$arrivo', '%Y-%m-%d'), INTERVAL +$durata DAY) <= valida_fino ";
    }

    // Se la durata è uguale a 16 significa che vuole vedere tutte le offerte e quindi non ci sono filtri da applicare
    elseif($durata=="16"){
    $query_offerte .= "";
    }
    [/php]
    ora dovrei lavorare sulla 14 notti...