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

Discussione: [SQL] con ciclo IF

  1. #1
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896

    [SQL] con ciclo IF

    Ciao a tutti!

    Come posso inserire un ciclo if nella mi query??
    mi spiego meglio:

    SELECT TAB1.* , TAB2.*
    FROM TAB1 LEFT JOIN ON TAB1.id = TAB2.tab1
    WHERE
    se TAB1.num > 0 allora prendi tutti i valori con TAB1.num2 > 0 altrimenti prendi tutti i record ( senza filtri)


    grazie...

  2. #2

    Re: [SQL] con ciclo IF

    Originariamente inviato da kodode
    Ciao a tutti!

    Come posso inserire un ciclo if nella mi query??
    mi spiego meglio:

    SELECT TAB1.* , TAB2.*
    FROM TAB1 LEFT JOIN ON TAB1.id = TAB2.tab1
    WHERE
    se TAB1.num > 0 allora prendi tutti i valori con TAB1.num2 > 0 altrimenti prendi tutti i record ( senza filtri)


    grazie...
    mi pare una richiesta incongruente.

    O prende tutto oppure solo dove TAB1.num > 0 and TAB1.num2 > 0

    delle due una sola.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    mmm...
    mi pare una richiesta incongruente.

    O prende tutto oppure solo dove TAB1.num > 0 and TAB1.num2 > 0

    delle due una sola.
    vabè io l'ho sparata.... mi sà che farò un bel ciclo prima...


    grazie...

  4. #4
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    eppure... mi pare strano nn si possa fare una cosa del genere... provo a rispiegare vediamo se mi faccio capire meglio... allora

    io ho un abbonamento con data di inizio (TAB1.ddi ) e data di fine (TAB1.ddf ), in più numero di ingressi iniziali (TAB1.nii ) e numero di ingressi disponibili (TAB1.nid).

    Un abbonamento deve aver una data di inizio e di fine però nn è obbligatorio che abbia degli ingressi (es. abbonamento mensile dove può entrare qunado vuole) quindi dovrei verificare se

    TAB1.ddi < CURDATE () AND
    TAB1.ddf > CURDATE ()

    e in più verificare se TAB1.nii è maggiore di zero allora anche TAB1.nid deve essere maggiore di zero...

    ho provato ad riassumere cosi ma nn funzia:

    ...
    AND (
    (
    TAB1.nii >0
    AND TAB1.nid >0
    )
    OR (
    TAB1.ini <= CURDATE( )
    AND TAB1.fin >= CURDATE( )
    )
    )

    un aiutino ?

  5. #5
    Forse si tratta solo di spiegarsi bene.

    il range di date inizio-fine ok e' chiaro. Quello che non e' chiaro e':
    e in più verificare se TAB1.nii è maggiore di zero allora anche TAB1.nid deve essere maggiore di zero...
    qui non si capisce se:

    se nella data del range tab1.nii DEVE essere maggiore di zero quindi condizione sine qua non (una AND), e tab1.nid DEVE essere anche lui maggiore di zero altra condzione assoluta(altro AND)

    oppure a prescindere dalla data se tab1.nii e tab1.nid sono maggiori di zero il record e' valido comunque (una OR).

    cose' la prima o la seconda?

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    ti chiedo scusa ma nn mi sembra nessuna delle due... ora provo a spiegarti tutto e vediamo se riesco ad essere + chiaro

    un abbonamento può essere o a ingressi liberi o a numero preciso di ingressi;
    quindi gli abbonamenti potranno essere (es. pratico):

    1) mensile con : una data di inizio , una di fine , numero di ingressi iniziali (in questo caso NULL ) e un numero di ingressi disponibili ( NULL )

    2) 5 ingressi con : una data di inizio , una di fine , numero di ingressi iniziali (in questo caso 5 ) e un numero di ingressi disponibili ( che può essere un num da 0 a 5)


    quindi lo scopo della mia query è di estrarre tutti gli abbonamenti attivi ossia devo
    rispettare queste regole:

    la data di inizio sia minore di oggi e la data di fine maggiore di oggi ( queste due condizioni sempre soddisfatte)
    inoltre se numero di ingressi iniziali è maggiore di zero ( e quindi mi trovo difronte a un abbonamento del tipo 2 ) oltre alla condizione delle date devo anche verificare che
    numero di ingressi disponibili sia maggiore di zero...

    spero di essere stato+ chiaro e ti ringrazio per la disponibilità...

  7. #7
    a questo punto farei una union. Non puoi chiedere due diverse condizioni nella stessa query.

    due condizioni perche' in pratica hai due tipi di abbonamento. Tipo 1 e tipo2 come se tu avessi un campo "tipo = 1 o 2", perche' e' poi questo che tu hai alla fin della fiera. un tipo di abbonamento esclude l'altro.

    codice:
    SELECT *
    FROM tab1
    LEFT JOIN TAB2 ON TAB1.id = TAB2.tab1
    WHERE CURDATE() BETWEEN TAB1.ini AND TAB1.fin
    AND TAB1.nii = 0
    UNION
    SELECT *
    FROM tab1
    LEFT JOIN TAB2 ON TAB1.id = TAB2.tab1
    WHERE CURDATE() BETWEEN TAB1.ini AND TAB1.fin 
    AND TAB1.nii > 0 AND TAB1.nid > 0

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    soluzione ottimale... grazie...

  9. #9
    Originariamente inviato da kodode
    soluzione ottimale... grazie...
    [sfogo_on]

    il problema principale e' quello di capire quello che serve. Nulla di peggio di quando uno maschera quello che effettivamente serve ed il perche' serve in un determinato modo.

    Non lo dico a te, ma in generale. c'e' questa (maledetta) tendenza sul forum, ad inventare qualcosa di simile al reale con il solo risultato di mixare e confondere tutto rendendo le cose difficili per tutti. Non diciamo poi quando scrivono... "non va" altre idee? oppure quando bisogna pure "indovinare" lo script ..... personalmente si guadagnano un posto in ignored list .... per quel che puo' valere ovviamente.

    [sfogo_off]

    Ad majora


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    visto che mi hai risposto qui mi sento direttamente colpito quindi rispondo:

    il tuo sfogo è più che lecito e sono pienamente d'accordo con te.
    Se il tuo sfogo è dovuto alla mia male esposizione del problema mi dispiace ( cercherò di studiare di più l'italiacano) se invece hai fraiteso che io abbia invetato "
    qualcosa di simile al reale con il solo risultato di mixare e confondere tutto rendendo le cose difficili per tutti
    è stato fatto solo per semplificare la query che in realtà era (prima del tuo prezioso aiuto):

    $sqlATL = "" ;
    $sqlATL .= "SELECT ATL.* , ADA.* , ADAtda , COAtda " ;
    $sqlATL .= "FROM ( ATL LEFT JOIN ADA ON ATLidr = ADAatl ) LEFT JOIN COA ON ADAtda = COAtda " ;
    $sqlATL .= "WHERE ATLdca IS NULL " ;
    $sqlATL .= "AND ADAdca IS NULL " ;
    $sqlATL .= "AND ADAtda IN ( " . $COAtda . " ) " ;
    $sqlATL .= "AND ATLidr NOT IN ( SELECT COPatl FROM COP WHERE COPcod = " . $CODidr . " ) " ;
    $sqlATL .= "AND CURDATE( ) BETWEEN ADAini AND ADAfin AND ADAnii = 0 " ;
    $sqlATL .= "AND ADAnii > 0 AND ADAnid > 0 " ;
    $sqlATL .= "GROUP BY ATLidr " ;
    $sqlATL .= "HAVING ADAatl IS NOT NULL " ;

    e quindi di focalizzare sul reale problema...
    Con questo rinnovo i ringraziamenti per il tuo aiuto e sottolineando il fatto che dopo diverso tempo che sei su un problema di sfugge la soluzione più semplice...

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