2012-01-27 3 views
0

Je crée la base de données sous-jacente pour un magasin. Il y a 2 tables, une pour les vêtements et une qui contient des cartes de taille standard. Les vêtements sont disponibles dans une ou plusieurs tailles et les tableaux de tailles contiennent plusieurs mesures pour chaque taille de vêtement.Joindre des tables avec des données d'ensemble

Exemple table tableau des tailles

id size waist chest hips height 
0 6  56  76  82  160 
0 8  60  80  86  162 
0 10  64  84  90  164 
0 12  68  88  94  166 
1 6  57  75  82  160 
1 8  61  79  86  162 
1 10  62  83  90  164 
1 12  63  87  94  166 

vêtements Exemple tableau

garment_id garment_name garment_type size_chart available_sizes 
0   Boating Jacket jacket   0   8,10,12  
1   Polka Dot Skirt skirt   1   10,12 

Ce que je veux faire est de les rejoindre pour que je

garment_id ... size_chart available_sizes size_chart.id size_chart.size  size_chart.(...) 
    0   ... 0   8,10,12  0     8 
    0   ... 0   8,10,12  0     10 
    0   ... 0   8,10,12  0     12 
    1   ... 1   10,12  1     10 
    1   ... 1   10,12  1     12 

Le problème que je rencontre est comment joindre afin que j'obtienne tous les nombres dans l'ensemble (taille_disponible) pour avoir une entrée correspondante pour measu rements ....

Toutes les idées/suggestions/conseils sur la façon dont je ferais mieux de le faire serait vraiment utile!

Merci.

+0

Merci à tous ceux qui ont répondu! Je suis allé avec la réponse de @Eugen Rick à la fin car il ressemble à la façon la plus simple de faire cela et m'a permis plus de fonctionnalités que je n'avais pas réellement perçues. Merci à tous pour l'affichage, tous massivement utile. –

Répondre

2

vêtements Exemple de table

garment_id garment_name garment_type size_chart available_sizes 
0   Boating Jacket jacket   0   8,10,12  
1   Polka Dot Skirt skirt   1   10,12 

est la racine de tous les maux - donc, parler après moi:

Je mémorisera jamais plus d'une information dans un seul champ db, si je veux pour y accéder séparément. Jamais.

Sur une note plus sérieuse, vous voulez laisser tomber le champ available_sizes de la table garments, au lieu de faire quelque chose comme

CREATE TABLE available_sizes (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    garment_id INT NOT NULL, 
    INDEX(garment_id), 
    size_id INT NOT NULL, 
    INDEX(size_id) 
) 

et le remplir. Cela rend facile de marquer une taille comme épuisé, peut-être même ajouter un qty_in_stock INT à la table, rechercher tous les vêtements du même type, qui sont disponibles dans une taille spécifique, etc

+0

LOL! Ok, donc je devrais faire une rangée séparée et avoir des clés primaires composites pour chacune, identifiant et taille de beignate. Je suppose que je peux renverser les informations de vêtement réel (nom de couleur, etc) dans une autre table pour éviter la duplication. –

+0

Voir mes modifications. Je ne suis pas sûr des couleurs (je ne suis pas un mec de mode) - si vous avez juste "rouge" cela pourrait être une idée, mais si vous avez "jupiter-rouge", "rouge feu", "rouge cerise" , "foo-red" aso vous pourriez juste vouloir les stocker en tant que texte. –

+0

Ne dites jamais jamais. La règle générale, comme je l'ai toujours entendu, est d'abord de normaliser, puis d'optimiser (pour la vitesse), si nécessaire. – bnieland

0

Une façon de le faire est d'utiliser SQL dynamique De mémoire, il serait simething comme ceci:

declare @cmd varchar(1000) 

declare @id int 
select @id = 0 

declare @inVariable varchar(20) 
select @inVariable = NULL 

while(true) 
begin 
    select @inVariable = availables_sizes from garment where id = @id 

    if (@inVariable <> NULL OR @inVariable <> '') 
    begin 

     if(@id > 0) 
     begin 
      select @cmd = 
      ' UNION select g.garment_id, g.size_chart, g.availables_sizes, c.id, c.size 
      from garments g 
      inner join chart c on g.size_chart = c.id 
        and c.id = ' + convert(varchar, @id) + ' 
        and c.size in (' + @invariable + ')' 
     end 
     else 
     begin 
      select @cmd = 
      'select g.garment_id, g.size_chart, g.availables_sizes, c.id, c.size 
      from garments g 
      inner join chart c on g.size_chart = c.id 
        and c.id = ' + convert(varchar, @id) + ' 
        and c.size in (' + @invariable + ')' 
     end 

     select @id = @id + 1 
    end 
    else 
    begin 
     break 
    end 
end 

exec(@cmd) 

Maintenant, comme @EugenRieck a déclaré, ce qui est mal!

0

Vous pouvez utiliser un cross join pour toutes les lignes, puis un sous-select à l'intérieur la clause SELECT initiale pour répertorier les tailles dans une colonne.

+0

ok, merci. Je vais regarder ça aussi. –

Questions connexes