Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [MySql] Problema con due query

    Salve a tutti i miei problema sono questi due:

    Primo Problema
    Ho una tabella con vari campi, tra questi due sono quelli che per ora mi servono

    Nome tabella: Ingressi

    Campi: Nome, Data, ...

    In poche parole ogni volta che un utente effettua un ingresso, viene registrato il suo nome, l'orario, più altre informazioni.

    Ogni tanto però ho la necessità di dover far pulizia, lasciando soltanto l'ultimo ingresso per ogni utente.

    Per far ciò ora come ora esegue le seguenti query (queste incollate qui non sono complete, era per dare un idea delle operazioni):

    CREATE TABLE temp_registroingressi(nome varchar( 20 ) NOT NULL default '', orario datetime NOT NULL;

    INSERT INTO temp_registroingressi SELECT nome, max(orario) AS orario FROM registroingressi GROUP BY nome;

    DROP TABLE registroingressi;

    ALTER TABLE temp_registroingressi RENAME registroingressi;


    Mi chiedevo, esiste un modo più veloce per eliminare direttamente i record che non mi servono?


    Secondo Problema

    Ho creato un forum strutturato in questo modo:

    Tabella FORUM
    Campi: ID,NOME,...

    Tabella: TOPIC
    Campi: ID,IDFORUM,TITOLO,...

    Tabella: POST
    Campi: ID,IDTOPIC,MESSAGGIO,...


    Ci ho pensato per bene ma ci sono due operazioni che vorrei far eseguire ma non saprei davvero come

    La prima è: Come faccio a trovare eventuali Post o Topic orfani? Ovvero Topic che puntano ad un forum non più esistente, o Post di discussioni eliminate?

    La seconda è: Man mano che procede il tempo, io cancello i messaggi vecchi, ma ovviamente il loro id continua a crescere, so che cancellando dalla tabella il campo id e poi rimettendolo, il loro conteggio ripartirebbe da zero, ma corro il rischio di sfasare tutto quanto, o almeno se lo facessi con i Topic..
    Qualcuno ha qualche idea?

    Ringrazio tutti anticipatamente

  2. #2

  3. #3

  4. #4
    Nessuno mi sa aiutare, nemmeno per uno dei problemi che ho descritto?

  5. #5
    Originariamente inviato da shake84
    Nessuno mi sa aiutare, nemmeno per uno dei problemi che ho descritto?
    per il primo non capisco il senso ... cioe' , una tabella a 2 campi con il solo nome ed il solo orario, tanto vale aggiornarlo l' orario se devi eliminarlo ... o no ?

    invece di inserire nuovi records per ogni nome fai l' update e la tabella rimane cntenuta, sbaglio ?

    oppure puoi fare la stessa cosa, se proprio ti serve cosi', attraverso una tabella temporanea vera (scritta nella memoria e non come se fosse una tabella mysql) che ti fa rispiarmiare il 400% di tempo sull' esecuzione ... oppure puoi fare una query incrociata ma ti serve MySQL 4.1 o superiore ... oppure boh, non mi viene in mente altro ...

    per il secondo quesito, sinceramente penso che se hai difficolta' per il primo abbastanza banale, dubito tu possa affrontare in modo appropriato un forum ... leggiti i db dei piu' famosi e prova a vedere come vengono gestiti
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Comincio con ringraziarti per avermi risposto,

    Ora cerco di spiegarmi meglio, nella prima tabella, oltre ad avere i due campi che ho elencato, ne ho anche altri, che non utilizzo per "ripulire" la tabella, ad esempio l'IP di si connette.

    Al momento ho la necessità di memorizzare tutti gli ingressi, poichè mi servono per alcuni controlli, solo una volta effettuati tali controlli posso procedere all'eliminazione degli ingressi più vecchi(di solito succede ogni 3/4 giorni).

    In pratica il mio problema è come faccio a selezionare tutti i record tranne quelli con l'orario più alto per ciascun utente?

    E' sulle query "inverse" che ho problemi

    Per il secondo punto il mio è un forum molto semplice (bhè in realtà non è stato troppo immediato scriverlo per me), comunque il maggior problema che ho avuto è che inizialmente era stato progettato davvero male, e tutto risiedeva in un'unica tabella(post, discussioni, ecc..) e non vorrei che già li, oppure nella conversione si fossero creati messaggi orfani..

    Comunque sia se provo a selezionare tutti i record di POST che hanno il campo idDiscussione uguale all' id di TOPIC, dovrei trovare tutti i record non orfani(stessa procedura con TOPIC e FORUM), il problema è che a me invece servono quei post che non riesco a selezionare..

    Nessuno saprebbe dirmi come costruire una query contraria a quella che ho appena descritto?

  7. #7
    Originariamente inviato da shake84

    In pratica il mio problema è come faccio a selezionare tutti i record tranne quelli con l'orario più alto per ciascun utente?
    Originariamente l'ho scritto sopra
    attraverso una tabella temporanea vera (scritta nella memoria e non come se fosse una tabella mysql) che ti fa rispiarmiare il 400% di tempo sull' esecuzione ... oppure puoi fare una query incrociata ma ti serve MySQL 4.1 o superiore ... oppure boh, non mi viene in mente altro ...


    Originariamente inviato da shake84
    il problema è che a me invece servono quei post che non riesco a selezionare..
    sempre meno chiaro ... che significa che nonriesci a selezionare ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Per la parte uno ti ringrazio.. speravo si potesse fare con una query semplice, ma visto che non si può fare vado a studiarmi le tabelle temporanee..

    Per la seconda parte provo a fare un esempio:

    Ho 2 tabelle:

    T1 che contiene 2 campi ID,NOME

    T2 che contiene 3 campi ID,IDTABELLA1,DESCRIZIONE

    Come si può intuire il campo IDTABELLA1 presente nella seconda tabella serve per identificare un record ben preciso nella prima.

    Se voglio selezionare tutti i record di T2 in cui il campo IDTABELLA1 abbia un corrispondente in T1 mi pari basti scrivere qualcosa del tipo:

    Select T2.* From T1,T2 Where T1.ID=T2.IDTABELLA1

    Se per caso in T2 dovesse esistere un record in cui il campo IDTABELLA1 "punta" ad un record inesistente della prima tabella, questo non verrebbe selezionato(almeno mi pare).

    Io mi chiedevo, che query devo usare per selezionare tutti e solo quei record in cui il campo IDTABELLA1 punta ad un id inesistente nella prima tabella? :master:

    Spero di essere stato più chiaro con questo esempio

  9. #9
    usando LEFT JOIN invece di INNER JOIN che ti rende solo le equi-join nel tuo caso.

    Con LEFT JOIN la prima tabella nominata (a sx) viene passata tutta, sia che ci sia la corrispondenza sia che manchi la corrispondenza con la tabella di DX. Nel caso non ci sia una relazione la tabella di DX presentera' un null.
    es. in tab2 (a dx) non e' presente il record id_tab1 = 2:
    codice:
    tab1          tab2
    id   dato1    id      id_tab1  dato2 
    
    1    pippo    1        1       pallo
    2    caccola  NULL   NULL      NULL
    3    gigio    2        3       topo
    in questo caso la query per trovare la corrispondenza mancante sara':
    codice:
    SELECT *
    FROM tab1
    LEFT JOIN tab2 ON tab1.id = tab2.id_tab1
    WHERE tab2.id_tab1 IS NULL
    credo che guardando i record esposti sopra la query si commenti da sola e dia l'idea della semplicita' della soluzione proposta. Otterro' l'elenco dei record di tab1 che non hanno corrispondenza con la tab2.


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

  10. #10
    :master: oh provato la soluzione di piero.mac, purtroppo però non mi funziona..

    ho fatto un paio di prove e praticamente succede questo:

    1-Se scrivo:
    SELECT *
    FROM topic
    LEFT JOIN post ON topic.id = post.idrisposta
    WHERE post.idrisposta IS NULL


    Non mi restituisce nessun record

    2-Se riscrivo la stessa query senza la condizione finale, ovvero:
    SELECT *
    FROM topic
    LEFT JOIN post ON topic.id = post.idrisposta


    Mi restituisce 9746 record su 9786, praticamente tutti tranne i 40 che presumo siano orfani..

    Però non riesco a capire come mai

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.