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

    [MySQL] JOIN campi INT e SET

    Raga urge aiuto,
    Non ne riesco a venirne a capo.

    Ho normalizzato un db strutturando determinate tabelle utilizzando dei campi SET pensando di fare la cosa giusta, e sono ancora convinto che sia cosi, il problema adesso è che non riesco a legarle insieme per recuperare i dati interessati, come esempio prendiamo una relatà scolastica, quindi la tabella dei docenti e quella delle loro classi, dove ovviamente è possibile che un docente abbia più classi a lui assegnate, e quindi nella tabella "docenti" o impostato il campo id_classe come SET


    dump delle tabelle

    codice:
    CREATE TABLE IF NOT EXISTS `classi` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `classe` varchar(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
    
    -- Dump dei dati per la tabella `classi`
    
    INSERT INTO `classi` (`id`, `classe`) VALUES
    (1, '1A'),
    (2, '2A'),
    (3, '3A'),
    (4, '1B'),
    (5, '2B'),
    (6, '3B'),
    (7, '1C'),
    (8, '2C'),
    (9, '3C'),
    (10, '1D'),
    (11, '2D'),
    (12, '3D'),
    (13, '1E'),
    (14, '2E'),
    (15, '3E'),
    (16, 'ALL');
    
    -- Struttura della tabella `docenti`
    
    CREATE TABLE IF NOT EXISTS `docenti` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `id_classe` set('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15') NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=56 ;
    
    -- Dump dei dati per la tabella `docenti`
    
    INSERT INTO `docenti` (`id`, `id_classe`) VALUES
    (53, '1,2,3'),
    (54, '1,2,3'),
    (55, '1,4,6');
    Ho provato un pò di queries ma senza successo, no so provo come unire un campo INT con un elenco di dati SET

    pensavo si potesse fare una cosa del genere ma non produce l'effetto desiderato, ovvero quello di rilevare l'id_docente e le sue rispettive classi
    codice:
    SELECT
    tb2.id AS id_docente,
    tb1.classe AS classe_docente
    FROM classi AS tb1
    JOIN docenti AS tb2 ON tb2.id_classe IN (tb1.id)

    Mi date una mano ?


    thanks




    .

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

    Re: [MySQL] JOIN campi INT e SET

    Originariamente inviato da newbobotime
    Raga urge aiuto,
    Non ne riesco a venirne a capo.

    Ho normalizzato un db strutturando determinate tabelle utilizzando dei campi SET pensando di fare la cosa giusta, e sono ancora convinto che sia cosi, il problema adesso è che non riesco a legarle insieme per recuperare i dati interessati, come esempio prendiamo una relatà scolastica, quindi la tabella dei docenti e quella delle loro classi, dove ovviamente è possibile che un docente abbia più classi a lui assegnate, e quindi nella tabella "docenti" o impostato il campo id_classe come SET


    dump delle tabelle

    codice:
    CREATE TABLE IF NOT EXISTS `classi` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `classe` varchar(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
    
    -- Dump dei dati per la tabella `classi`
    
    INSERT INTO `classi` (`id`, `classe`) VALUES
    (1, '1A'),
    (2, '2A'),
    (3, '3A'),
    (4, '1B'),
    (5, '2B'),
    (6, '3B'),
    (7, '1C'),
    (8, '2C'),
    (9, '3C'),
    (10, '1D'),
    (11, '2D'),
    (12, '3D'),
    (13, '1E'),
    (14, '2E'),
    (15, '3E'),
    (16, 'ALL');
    
    -- Struttura della tabella `docenti`
    
    CREATE TABLE IF NOT EXISTS `docenti` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `id_classe` set('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15') NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=56 ;
    
    -- Dump dei dati per la tabella `docenti`
    
    INSERT INTO `docenti` (`id`, `id_classe`) VALUES
    (53, '1,2,3'),
    (54, '1,2,3'),
    (55, '1,4,6');
    Ho provato un pò di queries ma senza successo, no so provo come unire un campo INT con un elenco di dati SET

    pensavo si potesse fare una cosa del genere ma non produce l'effetto desiderato, ovvero quello di rilevare l'id_docente e le sue rispettive classi
    codice:
    SELECT
    tb2.id AS id_docente,
    tb1.classe AS classe_docente
    FROM classi AS tb1
    JOIN docenti AS tb2 ON tb2.id_classe IN (tb1.id)

    Mi date una mano ?


    thanks




    .
    Secondo me non dovresti usare nessun campo set, al max ti mappi una tabella di mezzo docenti_classi e te ne esci nel migliore dei modi. L'uso del campo di tipo set è una scorciatoia ma non risponde ad una vera normalizzazione della base dati.

    Se esiste una relazione N ad M tra due tabelle questa si mappa con una tabella di mezzo. Già le difficoltà che stai avendo con le query dovrebbero farti cambiare idea

  3. #3
    Ciao Joe Taras,
    apprezzo il consiglio, una delle strade che prenderò in considerazione è sicuramente quella che proponi, ma tecnicamente è possibile legare con una join le 2 tabelle ?

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da newbobotime
    Ciao Joe Taras,
    apprezzo il consiglio, una delle strade che prenderò in considerazione è sicuramente quella che proponi, ma tecnicamente è possibile legare con una join le 2 tabelle ?
    L'istruzione SET ti considera il campo come un insieme di elementi e quindi se fai una select su quel campo ti esce non un numero ma una sequenza. A questo punto dovresti effettuare un parse del contenuto del campo (il che non è una cosa fattibile con una sola query a meno che non esiste qualche istruzione che estrapoli l'i-esimo elemento del set).

    In conclusione, non mi viene alcun modo immediato per implementare una join del genere. Tralaltro non so nemmeno se con altri DBMS questa struttura dati possa reggere, quindi prima di adottarla verifica, in quanto un domani potresti essere portato a cambiare il DBMS e diventerebbe un bagno di sangue.

  5. #5
    ok, vedo di produrre la tabella di relazione.

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.