Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    7

    [MySQL] NON ritornare record se presente una condizione

    Salve.

    Ho una tabella contenente id e parola, rispettivamente numero e testo (ma vah?)
    La tabella non ha chiavi primarie in quanto per ogni ID può essere presente più di una parola.

    Ebbene io avrei bisogno di una query PHP che dato in input una parola, restituisca l'ID che NON contiene quella parola.

    Es:
    id=1 parola="sgabello"
    id=1 parola="borraccia"
    id=1 parola="cannuccia"
    id=2 parola="sgabello"
    id=2 parola="ananas"
    id=2 parola="fucile a canna mozza"
    Dando in input la parola "borraccia", dovrebbe ritornarmi solo id=2

    Facilmente risolvibile se per ogni ID, ci fosse una parola sola, ma purtroppo per ogni ID, vi possono essere più parole.

    Vi ringrazio anticipatamente.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    la risposta "giusta" dipende dagli indici esistenti, e dalla relativa selettività.

    una soluzione inefficiente ma brutale è

    select distinct(id) from beerman where id not in (select distinct(id) from beerman where parola='borraccia')

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    7
    Ciao.
    Ti ringrazio per la risposta, molto gentile.

    Ho provato la query, funziona ed attualmente sembra la migliore soluzione.

    In realtà la query è molto più complessa...dovevo capire solo la maniera di "separare" i record.

    Allora:
    La tabella contiene id e due timestamp, tsfrom e tsto (il primo sempre minore del secondo).
    La tabella dunque contiene delle "linee temporali" di cui il loro inizio e la loro fine sono marcati da questi due timestamp.
    Dati in input altri due timestamp, che segnano l'inizio e la fine di una linea temporale, creare una query che controlli se questa "linea" combacia con una delle linee presenti della tabella. Se si allora NON ritornare quell'ID.

    Codice PHP:
    Dunque ho SELECT (cavolateFROM (molte tabelleWHERE (condizioni) AND id IN (

    //da quì in poi, la nostra select interessata
    SELECT DISTINCT(idFROM occupati WHERE id NOT IN (SELECT DISTINCT(idFROM occupati WHERE (tsinizio<".$tsal." AND tsfine>".$tsal.")OR(tsinizio<".$tsdal." AND tsfine>".$tsdal.")))"; 
    Da premettere inoltre che per il mio problema non riesco per ora a trovare soluzioni PHP / MySQL interessanti:
    Per ogni id esistono diversi periodi di tempo (segnati da un inizio e da una fine). Possono essere 0 come possono essere 20 (il numero degli intervalli può aumentare e diminuire e non è mai fisso). Dato in input una linea temporale (segnata sempre da un inizio ed una fine), scartare quegli ID che hanno linee temporali, combacianti con la linea temporale presa in input.

    Ok: La soluzione che ti ho fatto vedere funziona. Dunque non voglio abusare della tua pazienza. Ma se tu conoscessi un sistema migliore per risolvere questo problema, fammi un fischio. Oppure dimmi solo cosa ne pensi

    Se non hai tempo, ti ringrazio comunque per la risposta/soluzione che mi hai dato (che ripeto: funziona).

    Grazie ancora.

    PS: Per le linee temporali ho scelto io il metodo di segnarli con un timestamp iniziale ed uno finale...secondo te potrebbe essere una soluzione migliore (PHP/MySQL parlando) segnare il timestamp iniziale e poi un timestamp che indichi la durata della linea temporale anzicché la sua fine?

  4. #4
    che vuol dire "combaciare"? fa' un esempio, pls

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    7
    Originariamente inviato da optime
    che vuol dire "combaciare"? fa' un esempio, pls
    Hai ragione: combaciare non è il termine giusto.
    Intendevo dire che se parte della linea data in input si possa sovrapporre con le linee presenti nel database

    Es:
    Nel database ci sono le seguenti "linee"
    1d=1 tsfrom=10 tsto=70
    1d=1 tsfrom=90 tsto=140
    1d=1 tsfrom=200 tsto=210
    Se abbiamo come input timestampstart=130 e timestampend=150, questa linea temporale si sovrappone con la seconda presente nel database.
    Invece se ad esempio abbiamo timestampstart=150 e timestampend=190, questa linea non si sovrappone con nessuna.

  6. #6
    e tu vuoi estrarre le righe che sono COMPLETAMENTE fuori dall'intervallo di tempo, giusto?

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    7
    Originariamente inviato da optime
    e tu vuoi estrarre le righe che sono COMPLETAMENTE fuori dall'intervallo di tempo, giusto?
    Esattamente: in pratica devo estrarre solo l'ID...
    In verità: ho una query lunga e complessa che deve estrarre degli ID da altre tabelle ed inoltre, NON deve estrarre gli ID che hanno almeno un intervallo di tempo nel DB in comune con l'intervallo di tempo dato in input

  8. #8
    ok, basta ragionarci un attimo. gli eventi che NON ricadono nell'intervallo sono quelli che finiscono prima dell'inizio dell'intervallo e quelli che iniziano dopo.

    una volta capito questo, la trasformazione in query è davvero banale

    that easy!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    la query IN (...) è inerentemente inefficiente in mysql, peggio ancora se la subquery dipendente è complessa, viene eseguita per ogni elaborazione del ciclo esterno.

    quindi
    1) usi mariadb invece di mysql
    2) spezzi la query e generi con un GROUP_CONCAT l'elenco degli ID, e poi li riprendi
    3) cambi del tutto l'approccio.

    Tornando al merito - visto che son pigrissimo - ti consiglio di dumpare la struttura delle tabelle magari con un po' di righe dentro, e dire "cosa" vuoi che salti fuori

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    7
    Ok: grazie ancora per le risposte...rispondo prima a Optime:
    Grazie, ho già risolto, come scritto sopra il mio problema ora era sapere SE esisteva una soluzione PHP/MySQL migliore.

    Rispondendo a Franzauker:
    Non posso cambiare database purtroppo...devo utilizzare per forza MySQL.
    Il database serve sopratutto per questa query ostrusa, per il resto non vi sono altre operazioni da fare con il database.
    Il sistema che devo creare, è un sistema generico per l'affitto di qualcosa e questa query è una query di ricerca (che sia immobile, barca, auto o panini con la bresaola), che chiameremo ID.
    Entrano in gioco tre fattori:
    1) Controllare se l'ID non è già occupato (questa è la query di qui abbiamo discusso fin'ora)
    2) Controllare il prezzo per l'affitto totale (in base al lasso di tempo e al prezzo massimo che si vuole spendere)
    3) Altre opzioni che contiene l'ID.

    Per il prezzo, il PROPRIETARIO (non l'affittuario) della cosa da affittare inserisce (obbligatoriamente) il prezzo al giorno, il prezzo a settimana, il prezzo al mese.
    Per le altre opzioni sono invece una serie di booleani inseriti all'interno di una riga di una tabella indicanti se un tipo di servizio è compreso o meno
    Es: id=1 frigo-bar=1 colazione_inclusa=1 fucile_a_canna_mozza_sotto_il_materasso=1

    Quando si esegue una ricerca, si inserisci il tempo in qui si vuole affittare quella cosa, il prezzo massimo che si vuole spendere ed eventualmente altre opzioni che deve possedere quella cosa. E' chiaro che la query è il risultato totale di tre query nidificate insieme di cui:
    1) Per controllare se occupato o meno, la query non varia in base al prezzo
    2) Per le opzioni, la query in PHP cambia (es:
    Codice PHP:
    if ($_POST[frigo-bar]==1){$query.=" AND frigo-bar=1";} 
    3) La sotto-query relativa al prezzo, cambia (tramite PHP) in base al numero di giorni che si affitta quella cosa...si esegue una query diversa se la cosa viene affittata per 4 giorni (il costo singolo del giorno moltiplicato X 4) e si esegue una query diversa se viene affittata per 10 giorni (il costo di una settimana + il costo del giorno singolo moltiplicato per 3).

    A me già basta che la query funzioni così comé
    Se poi la query si può migliorare ulteriormente anche cambiando l'approccio, oppure un sistema di inserimento dei dati diverso, ben venga

    Grazie ancora

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 © 2026 vBulletin Solutions, Inc. All rights reserved.