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

    [MySQL] più campi in un solo campo

    Salve,
    ho dei record appartenenti a varie categorie, ognuna delle quali è espressa con una stringa tipo questa:

    codice:
    operations:documents:2007
    In questo caso il record fa parte della categoria operations, sottocategoria documents, sottocategoria 2007.

    Potrei aggiungere tre nuovi campi in tabella, scomporre la stringa sul delimitatore ":" con un explode e inserire ogni valore nell'apposito campo ma questa soluzione appesantirebbe troppo la tabella in termini di prestazioni, che conta già un alto numero di campi e indici.

    Cosa comporta allora creare un unico campo 'category' in cui inserire la stringa bell'e pronta così com'è?
    Intendo dire, in caso di ricerca di tutti i record dell'anno 2007, una query del genere

    codice:
    SELECT * FROM table WHERE category LIKE '%:2007'
    sembra troppo macchinosa oppure può andare?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    up
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  3. #3
    ciao,
    misembra che possa andar bene.
    prova e verifica come va....

  4. #4
    A funzionare funziona anche se ancora non so quanto possa essere performante.
    Inoltre mi sono reso conto che non posso selezionare dei DISTINCT(subcategory_1) e DISTINCT(subcategory_2)
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da emanueledg
    A funzionare funziona anche se ancora non so quanto possa essere performante.
    Inoltre mi sono reso conto che non posso selezionare dei DISTINCT(subcategory_1) e DISTINCT(subcategory_2)
    Per suddividere la stringa nelle sue tre parti prova così
    codice:
    select stringa,substring_index(stringa,':',1) as categoria,
    substring_index(substring_index(stringa,':',2),':',-1) as sottocategoria,
    substring_index(stringa,':',-1) as anno
    from tabella
    in questo modo ti è facile fare i vari distinct del caso.
    Secondo me comunque sarebbe più corretto usare tre campi separati e penso che anche le query sarebbero più veloci e semplici da gestire.

  6. #6
    Scusami emanueledg, volevo solo precisare una cosa.

    La clausola distinct non può essere ad usata come l'hai descritta

    DISTINCT(subcategory_1) e DISTINCT(subcategory_2)

    perchè DISTINCT è un costrutto che si applica a tutta la select ovvero mostra una sola volta i record che hanno un valore identico in ogni colonna.

    Per raggruppare i record per singoli campi devi usare GROUP BY

    ...GROUP BY subcategory_1, subcategory_2
    Michele Castellucci
    Sviluppatore Web del Consorzio CottonBit
    Consorzio Cottonbit
    Risorse per la programmazione
    Dire Fare Programmare!

  7. #7
    Grazie mille,
    quell'uso di substring_index(stringa,':',1) è geniale.
    Corrisponde ad un explode(":", stringa)[1], che compresso in un solo passaggio neanche in PHP si può fare...

    Comunque hai perfettamente ragione sulle prestazioni.
    Io mi preoccupavo di prestazioni del DB in termini generali, memoria occupata, numero di campi tabella... Però per le singole query è innegabile il guadagno di prestazioni con l'aggiunta di tre campi separati.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  8. #8
    Originariamente inviato da ghiaccio84
    Scusami emanueledg, volevo solo precisare una cosa.

    La clausola distinct non può essere ad usata come l'hai descritta

    DISTINCT(subcategory_1) e DISTINCT(subcategory_2)

    perchè DISTINCT è un costrutto che si applica a tutta la select ovvero mostra una sola volta i record che hanno un valore identico in ogni colonna.

    Per raggruppare i record per singoli campi devi usare GROUP BY

    ...GROUP BY subcategory_1, subcategory_2
    Non capisco cosa intendi, vuoi dire che non posso selezionare due DISTINCT(field) ?

    Su questo sono d'accordo, ho scritto così DISTINCT(subcategory_1) e DISTINCT(subcategory_2) intendendo che non li posso tirar fuori (in due query diverse) perché il DISTINCT(substring_index(field, ":", 1)) non credo che funzionerebbe.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  9. #9
    Originariamente inviato da emanueledg
    Non capisco cosa intendi, vuoi dire che non posso selezionare due DISTINCT(field) ?

    Su questo sono d'accordo, ho scritto così DISTINCT(subcategory_1) e DISTINCT(subcategory_2) intendendo che non li posso tirar fuori (in due query diverse) perché il DISTINCT(substring_index(field, ":", 1)) non credo che funzionerebbe.

    Invece mi sbagliavo, funziona!
    codice:
    SELECT DISTINCT (
    substring_index( category, ":", 1 )
    )
    FROM `table`
    GROUP BY item_category
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  10. #10
    Si esatto, puoi fare

    SELECT DISTINCT campo1, campo2 ........

    Ma non un distinct per ogni campo, per far quello devi usare group by.

    La sintassi con parentesi non quale funzione abbia, nel manuale non ho trovato nulla.
    Ho capito solo che funziona come il distinct senza parentesi ma solo se selezioni un solo campo nel SELECT:

    SELECT DISTINCT (campo) FROM......

    Infatti la query

    codice:
    SELECT DISTINCT (
    substring_index( category, ":", 1 )
    )
    FROM `table`
    GROUP BY item_category
    Seleziona un solo campo e puoi scrivere il DISTINCT con o senza parentesi.
    La query funziona e da un risultato uguale in tutti e due i casi.
    Michele Castellucci
    Sviluppatore Web del Consorzio CottonBit
    Consorzio Cottonbit
    Risorse per la programmazione
    Dire Fare Programmare!

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.