2010-08-03 4 views
0

J'ai une table avec un champ de nom et de type. Le champ de type contient le goût musical de la personne ainsi:Comment puis-je filtrer ces données de ma base de données?

« Rock, Pop, Métal, Dance » (varchar)

Je dois générer une liste Excel avec ces personnes regroupées par goût de la musique.

Par exemple:

  1. liste un avec tout le monde à Rock; Métal; Danse
  2. Un autre avec tout le monde dans Rock; Métal; Trance
  3. autre avec Rock (Only Rock)
  4. et ainsi de suite ...

Chaque utilisateur ne peut être que dans une seule liste. J'ai besoin de cette liste pour importer dans mon logiciel de newsletter. Chaque type est une liste de diffusion.

Je dois effectuer toutes sortes de combinaisons et ensuite créer la liste quand j'obtiens des résultats. Je me demandais quelle est la meilleure et la plus rapide pour ce faire. Peut être triture un script php ou même juste SQL.

Ps .: J'ai besoin de ces données d'une ancienne base de données créée par quelqu'un d'autre. Je suis d'accord, c'est une façon terrible de stocker.

+8

Bien que ce ne soit pas une réponse à votre question, vous devriez envisager de normaliser votre base de données. –

+0

Est-il possible que la chaîne soit "Metal; Rock; Dance"? Est-ce différent de "Rock, Metal, Dance"? Est-ce toujours le format exact ou les espaces sont-ils parfois manquants, parfois des virgules au lieu de points-virgules, etc.? –

+0

J'ai besoin de ces données d'une ancienne base de données créée par quelqu'un d'autre. Je suis d'accord, c'est une façon terrible de stocker. L'ordre semble être toujours le même. Dans ce cas, après réflexion, semble que GROUP BY va créer toutes les listes.Sinon, je peux utiliser ORDER BY et ensuite diviser comme Scott a dit. –

Répondre

2

Il me semble que vous pouvez exécuter cette requête simple:

SELECT * FROM table_name ORDER BY music_taste_field 

puis diviser le résultat lorsque la valeur des music_taste_field changements. Vous pouvez le faire manuellement ou en PHP. En outre, comme quelqu'un d'autre l'a fait remarquer, c'est une façon terrible de stocker les préférences musicales.

0

Et une autre mauvaise conception de base de données (était une question similaire aujourd'hui). Tout d'abord, pour toutes les opérations futures, toutes les énumérations de votre base de données doivent être des structures relationnelles séparées (par exemple, des tables). De cette façon, il serait très facile de créer ces listes, en utilisant des champs indexés.

Maintenant, vous appelez des fonctions de manipulation de chaînes qui fonctionnent lentement, oubliez les index, ce qui vous laisse une requête environ 100 fois plus lente et des données moins sûres. C'est là que la mauvaise conception de la base de données conduit.

Vous pourriez bien sûr utiliser quelque chose comme find_in_set() après avoir remplacé le point-virgule par une virgule, mais c'est de la perversion.
La meilleure solution consiste à reconcevoir la base de données si d'autres demandes de ce type sont nécessaires.

Questions connexes