Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [mysql] Not Exists

  1. #1

    [mysql] Not Exists

    salve io ho questa query
    SELECT email.id AS id, email.email AS email, email.chiave AS chiave, email.id_portale AS id_portale
    FROM email
    WHERE email.id_portale = '1' AND email.attivo = 'si'
    AND NOT EXISTS(
    SELECT
    NULL
    FROM
    invio
    WHERE
    invio.id_comunicazione <> '4' AND invio.id_utente = email.id
    )
    order by email.id desc

    fa pienamente il suo dovere ma è davvero molto pesante e si blocca il server
    in sostanza mi resistuisce tutte le email che appartengono a id_portale = '1' e che sono attive
    attivo = 'si' ma che non sono presenti nella tabella invio(quindi non già inviate ) per la comunicazuione con id=4
    mi aiutate ad alleggerirla facendola diventare meno pesante per il sistema
    grazie

  2. #2
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Francamente è la prima volta che vedo un approccio del genere, ad ogni modo se utilizzi mysql <5.5 (ma anche 5.6) le subquery dipendenti vengono eseguite per ogni singola esecuzione.

    Hai quindi varie possibilità
    1) usi mariadb
    2) usi mysql 5.6
    3) riscrivi con un join
    4) fai due query, con la prima fai un GROUP_CONCAT degli id, con la seconda metti where... IN (elenco_ID). Questo "spezzettamento" funziona, su mysql. Non funziona benissimo, però, se il GROUP_concat è molto grande

  3. #3
    Ciao,
    prova la query sotto riportata

    codice:
    SELECT email.id AS id, email.email AS email, email.chiave AS chiave, email.id_portale AS id_portale
    FROM email left outer join (select * from invio WHERE id_comunicazione <> '4') tb_invio ON tb_invio.id_utente = email.id
    WHERE email.id_portale = '1' AND email.attivo = 'si' AND tb_invio.id_utente is null
    è una select con left join su email e per selezionare solo quelli presenti su mail e assenti su invio bisogna aggiungere la condizione "AND tb_invio.id_utente is null"

  4. #4
    funziona ma è ancora troppo pesante. vorrei capire questo:
    left outer join (select * from invio WHERE id_comunicazione <> '4') invio ON invio.id_utente = email.id
    questo (select * from invio WHERE id_comunicazione <> '4') contenuto nelle parentedi tonde in quel posto cosa fa?
    grazie

  5. #5
    questo (select * from invio WHERE id_comunicazione <> '4') contenuto nelle parentedi tonde
    estrae il contenuto di invio filtrato per poi unirlo in join con l'altra tabella.
    Nelle join, per evitare di invalidare le left/right join, bisogna applicare i filtri prima di legarli in join

    Ps: se è ancora lento dovresti creare l'indice sulle due tabelle sul campo utilizzato nelle join e nei filtri
    Ciao
    Mik

  6. #6
    ok grazie. oggi ho imp0arato un'altra cosa. proverò e ti farò sapere

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.