Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    33

    [MySQL] Progettazione tabelle servizi

    Ciao,
    devo realizzare una struttura di tabelle relazionate che mi consenta, via sql, di gestire questo scenario:


    esistono servizi con caratteristiche proprie, relazionati a listini di servizi, ogni tipologia di servizio ha quindi una sua tabella legata al rispettivo catalogo attraverso codice servizio(varchar) (1aN):


    ServizioA(indice_numerico_SA,codice_servizio,altri _campi)
    Catalogo_ServizioA(indice__numericoCSA,codice_serv izio,altri_campi)


    ServizioB(id_numerico_SB,codice_servizio,altri_cam pi)
    Catalogo_ServizioB(indice_numericoCSB,codice_servi zio,altri_campi)


    ServizioC(id_numerico_SC,codice_servizio,altri_cam pi)
    Catalogo_ServizioA(indice_numericoCSC,codice_servi zio,altri_campi)


    mi serve una tabella che gestica queste informazioni
    ServiziErogati(indice_numericoSE,tipo_servizio,id_ servizio, altri_campi)


    Devo cioè creare una struttura di tabelle che mi consenta di interrogare il db via SQL per avere l'elenco dei servizi erogati relazionati alle diverse tabelle (che possono avere indici numerici uguali).


    Credo di avere bisogno di un'ulteriore tabella tra ServiziErogati e le varie Servizio per creare i JOIN giusti ma mi sono incartato di brutto...


    possibili soluzioni/alternative alla mia logica?

  2. #2
    Scusa, ma prima di dire boiate vorrei capire un attimo...
    Hai creato 3 o 6 tabelle?
    I cataloghi ed i servizi, sono effettivamente tanti da non poterli interire in un unica tabella?

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    33
    ciao,
    in realtà le tabelle servizi sono 5 con relativi cataloghi correlati.
    Sono 5 tabelle di servizi distinti perchè difformi tra loro (corsi in aula, corsi elearning asincrono, voucher, consulenze, corsi in conference) ognuno ha modalità di fruizione diverse con conseguenti campi dedicati.

    A complicare il tutto c'è anche una tabella utenti collegata a servizi_fruiti che si lega alla tabella servizi.

    cioè, io devo sapere che mario rossi (utenti), attraverso la tabella servizi_fruiti, ha fruito, distinguendoli tra loro di diversi servizi

  4. #4
    Allora, ho avuto un problema simile per la gestione degli ordini di un mobilificio.
    Clienti e fornitori, ma collegati.
    Il cliente ordina un mobile, ed il mobilificio associa l'ordine del cliente all'ordine che deve fare al fornitore. Il tutto si complicava quando lo stesso cliente ordivava in tempi diversi da molteplici fornitori differenti.

    Ho risolto con una relazione molti a molti.

    Devi creare una ulteriore tabella, che viene integrata dall'unione delle altre tabelle. Nel tuo caso però se non ho capito male, dovresti crearne almeno 2 di tabelle.
    Mettendo in relazione uno a molti .

    ES.

    Tab A e B.

    Tab A uno-molti su Z campi 1,2,3
    Tab B uno-molti su Z Campi 4,5,6

    Risultato è una tabella Z con relazione molti a molti tra A e B.

    Attenzione:!!!! Controlla le prestazioni del db, perchè così facendo crei una tabella che duplica i dati ti tutte le tabelle in maniera spropositata nel tempo.


    Nel tuo caso associ i servizi alle pesone, e le persone ad altri servizi.
    Con la relazione dovrebbe darti tutte le associazioni delle persone ai relativi servizi.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    33
    grazie per la risposta.

    ok, per gli utenti c'è la tabella servizi_fruiti (Molti a Molti) tra Utenti e Servizi.


    il problema è avere una relazione tra i servizi_erogati e le tabelle con i servizi
    facendo riferimento allo schema sopra:

    ServizioA(indice_numerico_SA,codice_servizio,altri _campi)
    Catalogo_ServizioA(indice__numericoCSA,codice_serv izio,altri_campi)

    ServizioB(id_numerico_SB,codice_servizio,altri_cam pi)
    Catalogo_ServizioB(indice_numericoCSB,codice_servi zio,altri_campi)

    ServiziErogati(indice_numericoSE,tipo_servizio,id_ servizio, altri_campi)

    semplificando a due soli servizi, ServiziErogati contiene

    ID; Tipo_servizio; id_servizio; altro
    1; 1; 1; bla bla >> servizioA(riga 1)
    2; 1; 2; bla bla >> servizioA(riga 2)
    3; 2; 1; bla bla >> servizioB(riga 1)


    come faccio a dire alla query di andare all'id 1 della tabellaA nella prima riga e all'id 1 ma nella tabellaB nella terza riga?


  6. #6

    Frenaaaaa, asp. Quando metti in relazione le tabelle, le sincronizzazioni le fa dasolo

    Ti posto una query di esempio.

    SELECT Anagrafica.Nominativo, Anagrafica.Indirizzo, Lavoro.Note, Lavoro.Colore, Lavoro.[Data Richiamo], Anagrafica.Telefono, Lavoro.data, Lavoro.[Data Appuntamento]
    FROM ([Ultimo di data Richiami] INNER JOIN Lavoro ON [Ultimo di data Richiami].MaxDiID = Lavoro.ID) INNER JOIN Anagrafica ON Lavoro.[ID Telefono] = Anagrafica.Telefono
    WHERE (((Lavoro.[Data Richiamo]) Is Null Or (Lavoro.[Data Richiamo])<Date()+1) AND ((Lavoro.Esito)="Richiamare") AND ((Lavoro.Operatore)=[Maschere]![Home]![OPNAME]));
    Se guardi nella riga FROM c'è inner join e subito dopo la relazione che mette in associazione i campi uguali che devono essere uguali nelle tabelle. Obbligatorio per relazionare le tabelle.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    33
    mhhhh...

    relaziono il campo ServiziErogati.id_servizio con tutti i campi indice_numerico le tabelle Servizi?

  8. #8


    Ancora no, scusa mi sono spiegato forse male.

    Allora nella tabella delle persone che possono avere più servizi, devi inserire un campo aggiuntivo per ogni tabella servizi.
    Ed associare ad ogni persona un tipo di servizio.

    Per i servizi invece devi avere un campo in entrambe le tabelle che li accomuna con una caratteristica.


    es:

    Tab A campi : Nome Cognome Indirizzo Numero-Telefono
    Tab B Campi : Azienda Prodotto Telefono-Referente

    Tab A è l'elenco dei referenti
    Tab B è l'elenco delle aziende

    Per relazionare ogni referente all'azienda, dovrai avere in entrambe le tabelle il telefono che si ripete, così potrai creare una JOIN che creerà la tabella C:

    Nome Cognome Indirizzo (Numero-Telefono o Telefono-Referente) Azienda Prodotto

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2004
    Messaggi
    33
    Ok danidefox!
    non ti arrabbiare...

    seguendo i tuoi consigli ho aggiunto un campo nelle tabelle servizi che ne definisce il tipo con il suo id:

    ServErog


    mysql> select * from ServErog
    +----+-------+----------+------+------+------+---------+-------+------+
    | idSE | servtype | type_id |
    +----+-------+----------+------+------+------+---------+-------+------+
    | 1 | 1 | 1 |
    | 2 | 2 | 1 |
    | 3 | 4 | 1 |
    | 4 | 3 | 1 |
    | 5 | 1 | 2 |
    +----+-------+----------+------+------+------+---------+-------+------+


    ServA
    mysql> select * from ServA
    +----+-------+----------+------+------+------+---------+-------+------+
    | idSA | service_code | type |
    +----+-------+----------+------+------+------+---------+-------+------+
    | 1 | codice bla | 1 |
    | 2 | codice ecc | 1 |
    | 3 | bla bla | 1 |
    +----+-------+----------+------+------+------+---------+-------+------+


    ServB
    mysql> select * from ServB
    +----+-------+----------+------+------+------+---------+-------+------+
    | idSB | service_code | type |
    +----+-------+----------+------+------+------+---------+-------+------+
    | 1 | codice bla | 2 |
    | 2 | codice ecc | 2 |
    | 3 | bla bla | 2 |
    +----+-------+----------+------+------+------+---------+-------+------+


    ServC
    mysql> select * from ServC
    +----+-------+----------+------+------+------+---------+-------+------+
    | idSC | service_code | type |
    +----+-------+----------+------+------+------+---------+-------+------+
    | 1 | codice bla | 3 |
    | 2 | codice ecc | 3 |
    | 3 | bla bla | 3 |
    +----+-------+----------+------+------+------+---------+-------+------+


    ServD
    mysql> select * from ServD
    +----+-------+----------+------+------+------+---------+-------+------+
    | idSA | service_code | type |
    +----+-------+----------+------+------+------+---------+-------+------+
    | 1 | codice bla | 4 |
    | 2 | codice ecc | 4 |
    | 3 | bla bla | 4 |
    +----+-------+----------+------+------+------+---------+-------+------+




    Select
    ServErog.idSE,
    ServErog.servtype,
    ServErog.typeid,
    ServA.idSA,
    ServA.type,
    ServB.idSB,
    ServB.type,
    Serv.idSA,
    Serv.type,
    ServD.idSA,
    ServD.type
    From
    ServErog
    Left Join
    ServA On ServErog.servtype = ServA.type And ServA.idSA = ServErog.typeid
    Left Join
    ServB On ServErog.servtype = ServB.type And ServB.idSB = ServErog.typeid
    Left Join
    ServC On ServErog.servtype = ServC.type And ServC.idSC = ServErog.typeid
    Left Join
    ServD On ServErog.servtype = ServD.type And ServD.idSD = ServErog.typeid
    Order By
    ServErog.idSE




    +----+-------+----------+------+------+------+---------+-------+------+
    | idSE | servtype | type_id | idSA | idSB | idSC | idSD|
    +----+-------+----------+------+------+------+---------+-------+------+
    | 1 | 1 | 1 | 1 | null | null | null |
    | 2 | 2 | 1 | null | 1 | null | null |
    | 3 | 4 | 1 | null | null | null | 1 |
    | 4 | 3 | 1 | null | null | 1 | null |
    | 5 | 1 | 2 | 2 | null | null | null |
    +----+-------+----------+------+------+------+---------+-------+------+


    Ottengo così tutti i campi relazionati a ServErog.... Perfetto!




    Ma se volessi creare una query che mi mostra i valori non presenti in ServErog, in pratica la negazione della Left Join precedente, come devo fare?
    Ho provato con is null, con right join ma non ci salto fuori

    dovrebbe mostrare questo:
    +----+-------+----------+------+------+------+---------+-------+------+
    | idSA | idSB | idSC | idSD|
    +----+-------+----------+------+------+------+---------+-------+------+
    | 3 | null | null | null |
    | null | 2 | null | null |
    | null | 3 | null | null |
    | null | null |2 | null |
    |null | null | 3 | null |
    | null | null |null | 2 |
    | null | null | null | 3 |
    +----+-------+----------+------+------+------+---------+-------+------+




    Apro un nuova discussione "[mySql] Left Join inversa"?

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.