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

    Select non esatta (MySql)

    Buonasera.

    Sono un neofita nel campo dei database quindi errori sono all'ordine del giorno.

    Per il mio piccolo sito sto realizzando una pagina la quale ha il "compito" di controllore da quanto tempo è inattivo un utente.

    So che si possono usare le sessioni ma ho la necessità di effettuare questo controllo a mezzo di una query sul mio db.

    Ho due tabelle le quali sono strutturate così ( riporto anche dati di esempio )

    1a tabella ( utenti )

    Id - Utente - Collegato
    1 - Luca - 1
    2 - Stefano - 1
    3 - Andrea - 0

    2a tabella ( eventi )

    Id - Utente - Evento - DataOra
    1 - Luca - Ingresso - 2012-04-01 18:54:22
    2 - Luca - Carica pag - 2012-04-01 18:55:22
    3 - Stefano - Carica pag - 2012-04-01 18:55:23
    4 - Luca - Modifica dati - 2012-04-01 18:57:22
    5 - Luca - Uscita - 2012-04-01 18:59:22
    6 - Stefano - Uscita - 2012-04-01 18:59:47

    Il problema è questo:

    Ho la necessità di estrarre il campo Utente e DataOra solo se l'utente ha il valore collegato = 1.

    Come posso fare?
    Ho provato così ma mi estrae sempre e solo il primo utente presente nella tabella Utenti anche quando il campo Collegato è a 0

    La query che ho provato:

    SELECT eventi.utente, dataora FROM eventi JOIN utenti WHERE collegato = '1' ORDER BY dataora ASC LIMIT 1

    Vi ringrazio sin da ora per l'aiuto.
    Saluti.

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: Select non esatta (MySql)

    Originariamente inviato da Trotttola
    Buonasera.

    Sono un neofita nel campo dei database quindi errori sono all'ordine del giorno.

    Per il mio piccolo sito sto realizzando una pagina la quale ha il "compito" di controllore da quanto tempo è inattivo un utente.

    So che si possono usare le sessioni ma ho la necessità di effettuare questo controllo a mezzo di una query sul mio db.

    Ho due tabelle le quali sono strutturate così ( riporto anche dati di esempio )

    1a tabella ( utenti )

    Id - Utente - Collegato
    1 - Luca - 1
    2 - Stefano - 1
    3 - Andrea - 0

    2a tabella ( eventi )

    Id - Utente - Evento - DataOra
    1 - Luca - Ingresso - 2012-04-01 18:54:22
    2 - Luca - Carica pag - 2012-04-01 18:55:22
    3 - Stefano - Carica pag - 2012-04-01 18:55:23
    4 - Luca - Modifica dati - 2012-04-01 18:57:22
    5 - Luca - Uscita - 2012-04-01 18:59:22
    6 - Stefano - Uscita - 2012-04-01 18:59:47

    Il problema è questo:

    Ho la necessità di estrarre il campo Utente e DataOra solo se l'utente ha il valore collegato = 1.

    Come posso fare?
    Ho provato così ma mi estrae sempre e solo il primo utente presente nella tabella Utenti anche quando il campo Collegato è a 0

    La query che ho provato:

    SELECT eventi.utente, dataora FROM eventi JOIN utenti WHERE collegato = '1' ORDER BY dataora ASC LIMIT 1

    Vi ringrazio sin da ora per l'aiuto.
    Saluti.
    codice:
    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utente.id
     WHERE utente.collegato = '1'
    Quella che ti ho scritto estrae tutti gli eventi legati ad un utente collegato, se, invece vuoi estrarre solo l'ultimo evento di un utente collegato la soluzione è differente:

    codice:
    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utente.id
     WHERE utente.collegato = '1' and eventi.dataora = 
        (select MAX(e2.dataora)
        FROM eventi e2
        where e2.utente = eventi.utente)
    Prova e dimmi se va bene

  3. #3
    Ti ringrazio per la risposta.

    Solo una curiosità prima di provare. Da dove spunta questo "e2" nella query.

    Ritengo molto importante l'aiuto che si può ottentere dalle persone però mi piacerebbe capire come "nascono" certe soluzioni.

    Ti ringrazio nuovamente.

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da Trotttola
    Ti ringrazio per la risposta.

    Solo una curiosità prima di provare. Da dove spunta questo "e2" nella query.

    Ritengo molto importante l'aiuto che si può ottentere dalle persone però mi piacerebbe capire come "nascono" certe soluzioni.

    Ti ringrazio nuovamente.

    codice:
    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utente.id
     WHERE utente.collegato = '1' and eventi.dataora = 
        (select MAX(e2.dataora)
        FROM eventi e2
        where e2.utente = eventi.utente)
    e2 è l'alias che ho assegnato alla tabella dentro la subquery non puoi usare 2 tabelle "eventi" senza assegnare l'alias a una delle due

  5. #5
    Perdona la mia ignoranza in materia.

    Solitamente non si assegna un alias con "AS"?

    Tipo "eventi AS e2"


    Spero di non rubarti troppo tempo.

  6. #6
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da Trotttola
    Perdona la mia ignoranza in materia.

    Solitamente non si assegna un alias con "AS"?

    Tipo "eventi AS e2"


    Spero di non rubarti troppo tempo.
    Ciao, non mi rubi tempo

    l'AS è opzionale

  7. #7

    Re: Re: Select non esatta (MySql)

    Ho provato la seconda soluzione:

    codice:
    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utente.id
     WHERE utente.collegato = '1' and eventi.dataora = 
        (select MAX(e2.dataora)
        FROM eventi e2
        where e2.utente = eventi.utente)
    Provandola direttamente in MySQL Query Bowser funziona, inteso come non genera errori, però non mi estrae nessun record nonostante siano presenti record nella tabella eventi e gli utenti siano impostati come collegati ( ovvero collegato = 1 )

    Suggerimenti?

  8. #8
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: Re: Re: Select non esatta (MySql)

    Originariamente inviato da Trotttola
    Ho provato la seconda soluzione:



    Provandola direttamente in MySQL Query Bowser funziona, inteso come non genera errori, però non mi estrae nessun record nonostante siano presenti record nella tabella eventi e gli utenti siano impostati come collegati ( ovvero collegato = 1 )

    Suggerimenti?
    Rivedendo come hai modellato le tabelle credo che il problema sia li.

    Tabella UTENTE:
    id - chiave della tabella
    utente - nome dell'utente

    Tabella EVENTI:
    id - chiave della tabella
    id_utente - chiave esterna alla tabella utente

    invece tu ripeti utente quindi non normalizzi la struttura

    quindi la clausola JOIN (se usi i campi che ti ho consigliato)
    diventa
    ON eventi.id_utente = utente.id, tutto il resto della query rimane uguale

  9. #9
    Ho fatto alcune prove in attesa della tua risposta in quanto c'era un dubbio che mi era "saltato" all'occhio ed ho corretto la query nel seguente modo.

    Da:

    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utente.id
    WHERE utente.collegato = '1' and eventi.dataora =
    (select MAX(e2.dataora)
    FROM eventi e2
    where e2.utente = eventi.utente)

    A:

    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utenti.utente
    WHERE utente.collegato = '1' and eventi.dataora =
    (select MAX(e2.dataora)
    FROM eventi e2
    where e2.utente = eventi.utente)

    Con questa modifica ora funziona.

    Ho fatto una cavolata?

  10. #10
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da Trotttola
    Ho fatto alcune prove in attesa della tua risposta in quanto c'era un dubbio che mi era "saltato" all'occhio ed ho corretto la query nel seguente modo.

    Da:

    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utente.id
    WHERE utente.collegato = '1' and eventi.dataora =
    (select MAX(e2.dataora)
    FROM eventi e2
    where e2.utente = eventi.utente)

    A:

    SELECT eventi.utente, dataora FROM eventi JOIN utenti
    ON eventi.utente = utenti.utente
    WHERE utente.collegato = '1' and eventi.dataora =
    (select MAX(e2.dataora)
    FROM eventi e2
    where e2.utente = eventi.utente)

    Con questa modifica ora funziona.

    Ho fatto una cavolata?
    Si, la modifica è corretta ma il DB non è modellato correttamente.

    Ti consiglio di farlo altrimenti potresti avere problemi di allineamento dati più in la.

    Dato che hai detto che sei neofita, ti consiglio di cercare in rete un pò di dispense sulla modellazione dei DB (cerca modello entità-relazioni) e le forme normali. Ti ritornerà sicuramente utile.

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.