[MySQL] WHERE IN and IF NOT EXISTS

  • Creatore Discussione Creatore Discussione felino
  • Data di inizio Data di inizio

felino

Utente Attivo
12 Dic 2013
941
10
18
Aci Catena (Catania)
Buonasera a tutti,
ho necessità di fare un query su due tabelle:

UTENTI
user_id | email | telefono | mobile

STRUTTURA
user | email | telefono | mobile

le due tabelle sono in relazione tramite user_id e user.

Ho creato la seguente query, che estrae le informazioni basandosi sul campo email:
Codice:
SELECT t1.email, t1.user_id, t1.telefono, t1.mobile, t2.telefono, t2.mobile
FROM utenti t1, struttura t2
WHERE 
t1.email IN (
'email1@email.it', 
'email2@email.it', 
'email3@email.it'
) 
and
t1.user_id = t2.user
ORDER BY t1.email

Ovviamente c'è un limite:
se l'indirizzo da me passato non è presente su UTENTI ma solo su STRUTTURA nella query non ottengo alcun record in merito.

Vorrei usare la condizione NOT EXISTS o scegliere un'altra strada in modo tale che se in indirizzo non viene trovato su UTENTI allora la query viene fatto su STRUTTURA.

Come posso procedere?

Grazie.
 
Codice:
select ....
from utenti t1
full outer join struttura t2
on t1.user_id = t2.user
where
t1.email IN (
'email1@email.it',
'email2@email.it',
'email3@email.it'
)
or
t2.email IN (
'email1@email.it',
'email2@email.it',
'email3@email.it'
)
attenzione all'OR
la tabella non presente verrà presentata con "null" (ms sql)
 
Grazie Marino51!

Un'altra condizione da aggiungere: non per forza t1.user_id ha una corrispondenza con t2.user.

Posso risolvere utilizzando un LEFT JOIN?

Codice:
Codice:
SELECT
    t1.email, t1.user_id, t1.telefono, t1.mobile, t2.telefono, t2.mobile
FROM
    utenti t1,
    LEFT JOIN struttura t2
WHERE (
        t1.email IN (
        'email1@email.it', 
        'email2@email.it', 
        'email3@email.it'
        ) 
    OR
        t2.email IN (
        'email1@email.it', 
        'email2@email.it', 
        'email3@email.it'
        )
    )
AND
    t1.user_id = t2.user
ORDER BY
    t1.email

Nel caso in cui la mail viene trovata in t2 e non in t1 l'ORBER BY t1.email potrebbe influire negativamente?
 
con left join, vengono estratti gli elementi dalla tabella t1 con o senza corrispondenza in t2
quindi ok order by, inutile or con condizione su t2
 
Il problema e' proprio questo: che alcuni indirizzi email possono essere presenti in t1 e non in t2 e viceversa.

Come faccio a far la query sul t2?

Grazie,
 
anziché usare left join sostituisci con right join e tutte le condizioni che hai applicato a t1 le applichi solo a t2
 
meglio scrivere ..
Codice:
SELECT
    t1.email, t1.user_id, t1.telefono, t1.mobile, t2.telefono, t2.mobile
FROM
    utenti t1,
    LEFT JOIN struttura t2
WHERE
      t1.email IN (
      'email1@email.it',
      'email2@email.it',
      'email3@email.it'
      )
AND
    t1.user_id = t2.user
ORDER BY
    t1.email


SELECT
    t1.email, t1.user_id, t1.telefono, t1.mobile, t2.telefono, t2.mobile
FROM
    struttura t2,
    LEFT JOIN utenti t1
WHERE
      t2.email IN (
      'email1@email.it',
      'email2@email.it',
      'email3@email.it'
      )
AND
    t2.user = t1.user_id
ORDER BY
    t2.email
 
Esatto Marino,Risolto,
la query da me usata coincide con la tua!

Codice:
SELECT
    t1.email, t2.email, t1.user_id, t1.mobile, t2.mobile
FROM
    utenti t1
    LEFT JOIN struttura t2 ON t1.user_id=t2.user
WHERE (
        t1.email IN (
        'email1@email.it', 
        'email2@email.it', 
        'email3@email.it'
        )
    OR
        t2.email IN (
        'email1@email.it', 
        'email2@email.it', 
        'email3@email.it'
        )
    )
ORDER BY
    t1.email, t2.email
 

Discussioni simili