Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Php : innerjoin con piu where and or

    Ciao a tutti,
    Non sono una cima sulle query troppo complesse e dopo un pomeriggio ci rinuncio
    Devo eseguire una INNER JOIN tra tre tabelle con piu clausole where, es :

    Tabella clienti
    idcliente
    ragione
    piva
    idzona
    ecc

    Tabella macchine
    idcliente
    idmacchina
    nome macchina
    motore
    anno
    marca

    Tabella zone
    idzona
    zona

    Ho fatto una cosa di questo tipo

    Codice PHP:
    $sSQL "
    SELECT * 
    FROM CLIENTI AS C
    INNER JOIN MOVIMENTIMACCHINARI AS M
    INNER JOIN ZONE AS Z ON C.IDCLI = M.IDCLI
    AND C.IDZONA = Z.IDZONA
    WHERE C.RAGSOCCLI LIKE 'C%'
    AND C.MARCA = 'VOLVO'
    AND C.MOTORE = '19'
    AND C.PROVCLI = 'Z1'
    OR C.PROVCLI = 'Z2'
    OR C.PROVCLI = 'Z3'
    OR C.PROVCLI = 'Z4'
    OR C.PROVCLI = 'Z5'
    OR C.PROVCLI = 'Z6'
    OR C.PROVCLI = 'Z7'
    OR C.PROVCLI = 'Z8'
    OR C.PROVCLI = 'Z9'
    GROUP BY C.IDCLI
    "

    la ricerca puo' essere fatta per una o piu zone (parte finale),
    per marca, per modello
    oppure per un qualsiasi dato della tabella clienti. in questo caso la ragione sociale.

    Il problema è questo :
    La ricerca per una o piu zone nel caso OR C.PROVCLI = '' sia NULL funziona stranamente correttamente, sono gli altri 2 o 3 parametri where che non vengono filtrati,

    e non ci sto capendo piu il perchè

    Ringrazio anticipatamente tutti e buon lavoro.

    ( La query è leggermente diversa a lavoro ma non me la ricordavo tutta )

  2. #2
    Mi rispondo da solo aggiungendo un ulteriore domanda

    Codice PHP:
    $sSQL =
    "SELECT * 
    FROM CLIENTI AS C
    INNER JOIN MOVIMENTIMACCHINARI AS M ON C.IDCLI = M.IDCLI
    INNER JOIN MARCA AS D ON M.IDMARCA = D.IDMARCA
    INNER JOIN BANCHE AS B ON C.IDBANCA = B.IDBANCA
    INNER JOIN CATEGORIEMACCHINARI AS CAT ON M.IDCATEGORIEMACCHINARI = CAT.IDCATEGORIEMACCHINARI
    WHERE C.RAGSOCCLI LIKE 'Mario Rossi'
    AND (
    C.PROVCLI = 'Z1'
    OR C.PROVCLI = ''
    OR C.PROVCLI = ''
    OR C.PROVCLI = ''
    OR C.PROVCLI = ''
    OR C.PROVCLI = 'Z7'
    OR C.PROVCLI = ''
    OR C.PROVCLI = ''
    OR C.PROVCLI = ''
    )
    GROUP BY C.RAGSOCCLI
    LIMIT 0 , 1 "

    era solo un problema di sintassi includendo l' AND tra parentesi ( )
    Ora ho questo problema :
    Le tabelle hanno 2 campi descrizione che sono una descrizione banca una descrizione macchina quando printo in php il dato come faccio a printare uno o l'altro ?

    Ringrazio anticipatamente

  3. #3
    Forse ti servono due parentesi?

    Codice PHP:
    $sSQL "
    SELECT *
    FROM CLIENTI AS C
    INNER JOIN MOVIMENTIMACCHINARI AS M
    INNER JOIN ZONE AS Z ON C.IDCLI = M.IDCLI
    AND C.IDZONA = Z.IDZONA
    WHERE C.RAGSOCCLI LIKE 'C%'
    AND C.MARCA = 'VOLVO'
    AND C.MOTORE = '19'
    AND (C.PROVCLI = 'Z1'
    OR C.PROVCLI = 'Z2'
    OR C.PROVCLI = 'Z3'
    OR C.PROVCLI = 'Z4'
    OR C.PROVCLI = 'Z5'
    OR C.PROVCLI = 'Z6'
    OR C.PROVCLI = 'Z7'
    OR C.PROVCLI = 'Z8'
    OR C.PROVCLI = 'Z9')
    GROUP BY C.IDCLI
    "


  4. #4
    Sono arrivato in ritardo di pochi secondi

    Per l'altra domanda, puoi dare nomi alle colonne:
    tabella1.descrizione AS descrizione1
    tabella2.descrizione AS descrizione2

  5. #5
    Mi confermo noobbissimo

    mi puoi applicare questi alias alla query cosi da capire come utilizzarli ?


    PS : grazie di tutto

  6. #6
    Non hai specificato i nomi delle tabelle con le descrizioni quindi uso nomi finti; sostanzialmente devi aggiungere i campi all'inizio della select:

    codice:
    SELECT *, tabella1.descrizione AS desc1, tabella2.descrizione AS desc2
    FROM [...]

  7. #7
    Grazie infinite funziona tutto come dovrebbe,

    e anche sta volta me la sono cavata

  8. #8
    E' emerso un ulteriore problema

    in questa query

    Codice PHP:
    SELECT 
    FROM CLIENTI AS C
    INNER JOIN MOVIMENTIMACCHINARI 
    AS M ON C.IDCLI M.IDCLI
    INNER JOIN MARCA 
    AS D ON M.IDMARCA D.IDMARCA
    INNER JOIN BANCHE 
    AS B ON C.IDBANCA B.IDBANCA
    INNER JOIN CATEGORIEMACCHINARI 
    AS CAT ON M.IDCATEGORIEMACCHINARI CAT.IDCATEGORIEMACCHINARI
    WHERE C
    .RAGSOCCLI LIKE '%PIPPO%'
    AND (
    C.PROVCLI 'Z1'
    OR C.PROVCLI 'Z2'
    OR C.PROVCLI 'Z3'
    OR C.PROVCLI 'Z4'
    OR C.PROVCLI 'Z5'
    OR C.PROVCLI 'Z6'
    OR C.PROVCLI 'Z7'
    OR C.PROVCLI 'Z8'
    OR C.PROVCLI 'Z9'


    Il nostro caro amico pippo non esce

    In questa invece si


    Codice PHP:
    SELECT 
    FROM CLIENTI
    WHERE RAGSOCCLI LIKE 
    '%PIPPO%'
    AND (
    PROVCLI 'Z1'
    OR PROVCLI 'Z2'
    OR PROVCLI 'Z3'
    OR PROVCLI 'Z4'
    OR PROVCLI 'Z5'
    OR PROVCLI 'Z6'
    OR PROVCLI 'Z7'
    OR PROVCLI 'Z8'
    OR PROVCLI 'Z9'

    Qualcuno mi aiuta a trovare l'errore per favore ?
    su alcune ricerche mi funziona tutto ok,
    solo con alcune ricerche non mi trova risultati, eppure sul db ci sono



    Una giornata per fare un query
    peccato che non sono pagato a ore

  9. #9
    E' possibile che ci siano clienti che non hanno record presenti in movimentimacchinari?
    Se e' cosi' prova a usare una LEFT JOIN invece della prima INNER JOIN.

  10. #10
    si era come dicevi tu, scusa il ritardo ma avevo accantonato sto progetto per qualche giorno, funziona egreggiamente

    volevo chiedere un consiglio piu che altro per sapere qual'e' il modo piu corretto di fare uno "scroll" tra i risultati di una query, spiego meglio :

    mi è stata richiesta la possibilità di andare al risultato successivo attraverso i pulsanti avanti e indietro, di solito giocherei sui LIMIT se il risultato fosse 1 solo, ma qua per realizzare un menù a tendina con i risultati , ho dovuto levare il LIMIT,


    come mi consigliate di aggiungere queste due opzioni ?

    la query è cosi :

    Codice PHP:
    $sSQL "
    SELECT *, C.IDCLI AS ID
    FROM CLIENTI AS C
    LEFT JOIN MOVIMENTIMACCHINARI AS M ON C.IDCLI = M.IDCLI
    LEFT JOIN MARCA AS D ON M.IDMARCA = D.IDMARCA
    LEFT JOIN BANCHE AS B ON C.IDBANCA = B.IDBANCA
    LEFT JOIN CATEGORIEMACCHINARI AS CAT ON M.IDCATEGORIEMACCHINARI = CAT.IDCATEGORIEMACCHINARI
    WHERE C."
    .$_REQUEST['ricerca']." LIKE '".$val."'
    AND C.IDGRADOIMPORTANZA  "
    .$ba."
    AND M.IDMARCA LIKE '"
    .$_REQUEST['mk']."'
    AND M.MODELLO LIKE '"
    .$mc."'
    AND M.MATRICOLA LIKE '"
    .$matricola."'
    AND (
    M.ANNO >= '"
    .$_REQUEST['aninf']."'
    OR M.ANNO <= '"
    .$_REQUEST['anmag']."'
    )
    AND (
    C.PROVCLI = '"
    .$_REQUEST['Z1']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z2']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z3']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z4']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z5']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z6']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z7']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z8']."'
    OR C.PROVCLI = '"
    .$_REQUEST['Z9']."'
    )
    GROUP BY C.RAGSOCCLI
    ORDER BY `C`.`RAGSOCCLI` ASC"
    ;

    $RS mysql_query($sSQL);
    $nRows mysql_num_rows($RS);
    if(
    $nRows 0) {
    for(
    $j 0$j $nRows$j++) {
    $sRS mysql_fetch_array($RS);


    echo(
    "risultati");

    }


    ringrazio anticipatamnte

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.