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

    [mysql] negare una query

    Ho una domanda bella tosta x chi ha molta dimstichezza con sql.

    Ho due tabelle
    Una con i campi:

    id (primaria)
    nick
    (ed altri che non ci interessano)

    un'altra con i campi:

    titolo
    messaggio
    id_autoreultimopost
    (ed altri)

    Nel campo id_autoreultimopost va inserito l'id preso dalla precedente tabella. Con una JOIN saranno stampati a video tutti i messaggi con il nick dell'autore ultimo post(un pò come accade x qst forum). La condizione ON della JOIN è: id_autoreultimopost=id

    Se x sbaglio un utente viene cancellato ma il suo id resta nella seconda tabella questo record non verrà elencato in quanto non verifica le condizioni della query.

    Come posso fare per elencare tutti i record in cui si verifica tale condizione? In pratica come posso fare una JOIN simile a quella d prima NEGANDOLA? Non va bene mettere <> al posto di = perché in questo caso ci sarebbe una relazione UNO A MOLTI (se la prima tabella ha 10 record d cui uno ha l'id uguale ad un record nella seconda tabella, ce ne saranno altri nove per cui è diverso quindi questa condizione non va bene). Io devo mantenere la relazione uno ad uno. Come posso fare?
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  2. #2
    utilizza LEFT JOIN.
    codice:
    SELECT *
    FROM TAB1
    LEFT JOIN TAB2
    ON TAB2.id_autoreultimopost = TAB1.id 
    WHERE TAB2.id_autoreultimopost IS NULL
    Ma e' una condizione che dovresti impedire che possa verificarsi. Trattasi di integrita' referenziale, dove il record in TAB2 risulterebbe inconsistente. Quindi prima di eliminare un record da tab1 dovresti verificare se ci sono sue referenze in tab2 ed eventualmente eliminare prima quelle. Questa integrita' referenziale la puoi ottenere in modo automatico con le innodb.


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

  3. #3
    sì infatti mi serve x correggere una tabella un pò sputtanata. le innodb hanno qualche controindicazione? posso convertire una tabella già esistente in una innodb? inoltre una left join funziona sicuro? io ho provato ma non andava non so xké!
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  4. #4
    Originariamente inviato da Nunkij
    sì infatti mi serve x correggere una tabella un pò sputtanata. le innodb hanno qualche controindicazione? posso convertire una tabella già esistente in una innodb? inoltre una left join funziona sicuro? io ho provato ma non andava non so xké!
    la query che ti ho proposto prende tutti i record di TAB1 che rispondono alla uguaglianza con TAB2. I record di TAB1 che non hanno corrispondenza nella TAB2 verranno associati a TAB2 campo = NULL.

    Quindi se prelevi il record dove TAB2 IS NULL significa trovare tutti i record che in TAB1 esistono ed in TAB2 no. Se quello che ti serve fosse invece l'opposto basta invertire la posizione delle due tabelle oppure usare RIGHT JOIN invece di LEFT JOIN.

    Le tabelle myIsam possono essere convertite in InnoDB facilmente, ma per associare la chiave esterna (foreign key) devi prima ripulire le tabelle. Cioe' rimuovere le inconsistenze.


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

  5. #5
    non so se può essere utile ma phpMyAdmin usa una query di questo tipo per verificare l'integrità referenziale tra tabelle MyISAM.
    In pratica, una volta impostate le foreign key in phpMyAdmin (non nelle tabelle!), basta selezionare una tabella, andare nella sezione "Operazioni" e tra le opzioni di "Amministrazione tabella" ci sarà "Controlla l'integrità delle referenze:" seguito dai link a tutte le relazioni di chiave esterna specificate per la tabella.

  6. #6
    Originariamente inviato da Gianni_T
    non so se può essere utile ma phpMyAdmin usa una query di questo tipo per verificare l'integrità referenziale tra tabelle MyISAM.
    Certo, ma e' necessario abilitare alcune tabelle come gia' a suo tempo descritto nella pillola "caratteristiche aggiuntive di phpmyadmin"

    http://forum.html.it/forum/showthrea...postid=7371702


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

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