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

    Inner/Left Join con Distinct

    Ho una tabella chiamata PERSONA con Idpersona, Nome, Cognome

    Ho due tabelle poi che son strutturate così ( i nomi dei campi li ho inventati )
    Codice PHP:
    TAB1 idTab1Idpersonatotale1filtro
    TAB2 
    idTab2Idpersonatotale2filtro 
    il campo filtro può avere come valori solo 1 o 0.
    E' possibile che su TAB1 e TAB2 compaia lo stesso idpersona, o anche che non compaia affatto in nessuna delle due tabelle.

    Devo fare una ricerca, basandomi su un campo input in cui l'utente cerca una persona in base al cognome che scrive ( per es. Rossi ), sia su TAB1 che TAB2, evitando però di ripetere la stessa persona se compare su entrambe le tabelle. Inoltre soltanto quelle righe di TAB1 e TAB2 in cui filtro è uguale 1.

    Avevo pensato a qualcosa del genere però non mi funziona e non so come inserire il Distinct (il mio manualetto di mysql non mi aiuta ) ..

    Codice PHP:
    $query "SELECT p.*, t1.totale1, t2.totale2 FROM persona AS p ";
    $query .= "INNER JOIN tab1 AS t1 ON t1.Idpersona= p.Idpersona";
    $query .= "INNER JOIN tab2 S t2 ON t2.Idpersona= p.Idpersona";
    $query .= "WHERE p.cognome LIKE '%ROSSI%'"

  2. #2
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Credo che una union select possa fare al caso tuo.
    Ciao

  3. #3
    Forse sbaglio ma strutturando così la query non ottengo quel che mi serve, anzi i dati mi sembrano tutti appaiati orizzontalmente, mentre a me serve comunque un elenco verticale

    Codice PHP:
    $query "(SELECT persona.*, seat.idPersona FROM Persona AS p ";
    $query .= "INNER JOIN tab1 AS t1 ON t1.totale1 = p.IdPersona WHERE p.cognome LIKE '%ROSSI%') UNION ";
    $query .= "(SELECT persona.*, t2.idPersona FROM Persona AS p ";
    $query .= "INNER JOIN tab2 AS t2 ON t2.totale2 = p.IdPersona WHERE p.cognome LIKE '%ROSSI%') "

  4. #4
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ma l'hai cliccato il link che ho postato?

  5. #5
    direi di si, mai utilizzato un union prima di oggi pom

  6. #6
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    codice:
    SELECT campo1, campo2 from TAB1 UNION SELECT campo1, campo2 from TAB2;
    I risultati sono restituiti in maniera verticale.
    Tieni presente che il numero dei campi estratti deve essere uguale per entrambe le tabelle,
    prova e facci sapere.

    Ciao

  7. #7
    Il suggerimento che mi hai dato è molto utile, ma non so se mi può servire, e ti spiego ora perchè illustrando meglio quel che devo fare ( me l'han spiegato bene a me solo ora ! )

    Ho una tabella NOMI in cui dentro ho questo
    ID - COGNOME
    1 - Rossi
    2 - Verdi
    3 - Bianchi

    Altre due tabelle fatte così
    IDNOME - CAMPO1 - CAMPO2
    1 - dato0 - dato1
    3 - dato3 - dato4

    IDNOME - CAMPO3
    2 - dato5
    3 - dato6

    Mi si chiede una vista con l'elenco delle persone filtrato da un form in cui inserisco il cognome e senza visualizzare i "doppioni" - nelle due tabelle è frequente infatti che compaia la stessa persona, come nei dati di esempio che ho scritto.
    E' possibile in una solo query ottenere qualcosa del genere ?

    COGNOME - CAMPO1 - CAMPO2 - CAMPO3
    Rossi - dato0 - dato1 - (vuoto)
    Verdi - (vuoto) - (vuoto) - dato5
    Bianchi - dato3 - dato4 - dato 6

    Secondo me no, o meglio, alle mie conoscenze attuali no, risolverei tutto facendo più query ma mi è stato chiesto il minor uso possibile del server visto che il numero dei record è veramente alto.

  8. #8
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    E' completamente diverso da quello che avevi detto inizialmente, in questo caso ti consiglierei questo tipo di query:

    Codice PHP:
    SELECT a.COGNOMEb.CAMPO1b.CAMPO2c.CAMPO3
    FROM tab1 a 
    LEFT JOIN tab2 b ON b
    .IDNOME a.ID 
    LEFT JOIN tab3 c ON c
    .IDNOME a.ID 
    Per la questione di non visualizzare i doppioni ti basterebbe sostituire a.COGNOME con DISTINCT(a.COGNOME) , però potrebbe essere un problema nel caso di omonimia o nel caso in cui la stessa persona inserita due o più volte, ma una volta con i campi delle altre tabelle valorizzati e altre volte no.

    In ogni caso prova quella query ovviamente riadattandola con i veri nomi delle tabelle e dei campi e fammi sapere.

    Ciao

  9. #9
    Ottima risposta grazie
    Un m o amico mi aveva suggerito qualcosa del genere però questa è la risposta del server (in questo caso il mio in locale )

    Fatal error: Maximum execution time of 300 seconds exceeded in C:\xampp\phpMyAdmin\libraries\dbi\mysqli.dbi.lib.p hp on line 176

    Non ti nascondo che i recordi di ognuna delle tre tabelle son circa 250.000 e per questo probabilmente non ce la fa in tempi "medi"

    L'unica soluzione penso sia allora di fare una join per volta (e in questo caso la inner dovrebbe andare bene ) e poi tramite due cicli for annidati controllare i risultati e vedere se trovo lo stesso ID. Altre idee non server-dispensive non mi vengono..

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.