Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    231

    [Mysql SQL] decodifica/split in SQL su un campo

    Ciao ragazzi,
    scusate ma non e' semplice farvi capire cosa mi serve (anche il titolo forse non e' ben descrittivo), quindi passo subito all'atto pratico:

    ho una tabella (tabella_1) con per esempio 3 campi:
    - id
    - titolo
    - id_categorie (di tipo testo)

    poi ho un'altra tabella (tabella_2) con 2 campi:
    - id_categoria
    - nome_categoria

    bene, dall'esempio si capisce che c'e' una relazione tra le due tabelle.

    Supponiamo che in tabella_1 ho il seguente record:
    - id: 1
    - titolo: ciao a tutti
    - id_categorie: 1,2,3

    Su tabella_2 ho i relativi record delle categorie, per esempio 3 record:
    - id_categoria: 1
    - nome_categoria: Categoria 1

    - id_categoria: 2
    - nome_categoria: Categoria 2

    - id_categoria: 3
    - nome_categoria: Categoria 3

    Ecco... io con una query, partendo da tabella_1, vorrei ottenere come risultato una cosa del genere:

    - id:1
    - titolo: ciao a tutti
    - categorie: Categoria 1, Categoria 2, Categoria 3

    Praticamente decodificando 1,2 e 3 in Categoria 1, Categoria 2 e Categoria 3.

    Si puó fare? se si come? con una LEFT JOIN non ci sono riuscito.

    Ciao e grazie Max
    http://www.mdlwork.com

  2. #2
    Quote Originariamente inviata da masdel1979 Visualizza il messaggio
    bene, dall'esempio si capisce che c'e' una relazione tra le due tabelle.
    NI, una relazione in quanto tale dovrebbe coinvolgere due attributi dello stesso "tipo".

    Tu hai da una parte una stringa dall'altra un intero.

    O meglio, il dbms non capisce che ce una relazione se in un campo vede : 1,2,3 e in un altro vede 1.

    Quindi la relazione ce a livello logico nella tua mente ma non nel db.

    Quindi sicuramente come primo passo devi modificare la "tabella_1" splittando i campi, lasciando dunque un solo numero in id_categorie.

    cosi facendo, con una semplice query ottieni quel che vuoi. Il grosso del lavoro e' dunque bonificare la tabella_1

    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  3. #3
    oppure introdurre una terza tabella

    tab1
    id
    titolo

    tab2
    id
    categoria

    tab3
    idTitolo
    idCategoria


  4. #4
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    231
    Ciao ragazzi,
    grazie per la risposte, molto chiare e precise.

    In realtá il problema principale é la struttura che non puó essere cambiata, qui ovviamente ho fatto un esempio piú semplice, ma abbiamo milioni di record che ormai sono cosí...

    x bomberdini:
    e se avessi una relazione diversa, del tipo (questo é un altro caso):

    tabella_1:

    invece di "id_categorie" tipo "cod_paesi"

    cod_paesi: ITA, IRL, AFG

    e poi nella tabella_2:

    - cod_paese: ITA
    - nome_categoria: Italia

    - cod_paese: IRL
    - nome_categoria: Irlanda

    - cod_paese: AFG
    - nome_categoria: Afganistan

    e quindi in modo tale da avere due campi (tabella_1.cod_paesi e tabella_2.cod_paese) esattamente uguali di tipo VARCHAR o TEXT e quindi coinvolgendo due attributi dello stesso tipo?

    Ciao e ancora grazie ad entrambi, Massimiliano
    http://www.mdlwork.com

  5. #5
    le categorie sono sempre di 3 lettere?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    231
    si in questo caso si, sempre, é l'ISO3 per i paesi, ciao MAX
    http://www.mdlwork.com

  7. #7
    Ciao anche io come gli altri ti dico che sarebbe meglio almeno aggiungere una terza tabella dato che non puoi modificare il resto dello schema.
    Cmq facendo una query particolare si riesce....:
    codice:
    select t.id,t.titolo,GROUP_CONCAT(nome_categoria order by id_categoria)
    from
    tabella_1 t,
    (
    SELECT id,
           t.id_categoria,
           nome_categoria
            FROM   tabella_2 t, 
                   (SELECT c.id, 
           Substring_index(Substring_index(id_categorie, ',', n.digit + 1), ',', -1) 
           id_categoria 
    FROM   tabella_1 c 
           INNER JOIN (SELECT 0 digit 
                       UNION ALL 
                       select id_categoria from tabella_2) n 
                   ON Length(REPLACE(id_categorie, ',', '')) <= 
                      Length(id_categorie) - n.digit ) D 
            WHERE  t.id_categoria = d.id_categoria) view
    where t.id = view.id
    group by t.id,t.titolo
    Puoi anche vederla e provarla qui http://sqlfiddle.com/#!2/3d2d9/14

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    231
    Grazie Francesco,
    funziona alla grande e in questo caso dovró fare cosí!

    Stamattina continuando le mie ricerche avevo visto qualcosa di simile, creando delle procedure in sql.

    Vi ringrazio ragazzi, quando scrivo qui ho sempre risposte mai banali, grazie a tutti!

    Ciao MAX
    http://www.mdlwork.com

  9. #9
    Quote Originariamente inviata da masdel1979 Visualizza il messaggio
    Grazie Francesco,
    funziona alla grande e in questo caso dovró fare cosí!

    Stamattina continuando le mie ricerche avevo visto qualcosa di simile, creando delle procedure in sql.

    Vi ringrazio ragazzi, quando scrivo qui ho sempre risposte mai banali, grazie a tutti!

    Ciao MAX
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

Tag per questa discussione

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.