Question

Désolé si le titre n’est pas aussi descriptif qu’il le devrait mais il est assez difficile d’expliquer en une phrase ce que j’essaie de faire;).

J'ai une table qui relie les objets parents à leurs enfants respectifs. Et j'ai une autre table avec tous les objets (parents et enfants) avec ses images respectives. Cependant, l'image est simplement définie pour les objets parents. Je voudrais mettre à jour ce dernier tableau et définir l'image de Childs la même image qui est déjà définie pour son parent. De plus, comme il y a plus d'une image pour chaque objet, j'aimerais en définir une en particulier, que je peux connaître en fonction d'une colonne d'attributs.

Mes tables ressemblent à quelque chose comme:

RelationTable

id-enfant

parent-id

Table des images

id-objet

attribut-id

URL de l'image

Et voici un exemple pour clarifier les choses:

Table des relations

id-enfant | parent-id

3 | 1

4 | 1

5 | 2

Table des images

object-id | attribut-id | URL de l'image

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | non

3 | badimage | non

4 | goodimage | non

4 | badimage | non

5 | goodimage | non

5 | badimage | non

Je souhaite donc que les images des objets 3, 4 et 5 (enfants) soient définies sur leurs images parent respectives, mais sur les images "correctes", à savoir les images avec "goodimage" comme attribut-id.

À la fin, il devrait ressembler à:

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | image1.jpg

3 | badimage | non

4 | goodimage | image1.jpg

4 | badimage | non

5 | goodimage | image2.jpg

5 | badimage | non

En fait, je me fiche de savoir si "badimage" est également défini, mais le plus important est "goodimage".

J'ai essayé quelque chose comme:

UPDATE ImageTable

SET image = (SELECT image-url FROM ImageTable WHERE ImageTable.object-id = RelationTable.parent-id AND ImageTable.attribute-id = 'goodimage')

WHERE ImageTable.object-id = RelationTable.child-id AND ImageTable.attribute-id = 'goodimage'

mais cela ne fonctionne pas car ce n'est pas la syntaxe SQL correcte. Je ne sais pas si je devrais utiliser une variable (jamais utilisée) ou si cela peut être fait avec une seule phrase SQL.

Toute aide serait très appréciée.

Était-ce utile?

La solution

quelque chose comme ça?

NOTES:

Ceci pourrait être fusionné en un    déclaration non-sous-requête mais j'étais    paresseux.

Je n'ai pas testé, j'attends des fautes de frappe

;WITH goodlist AS
(
  SELECT child-id, image-url
  FROM relationstable
  left join imagetable on relationstable.child-id = relationstable.child-id and attribute-id = "goodimage"
)
UPATE imagetable
 set imagetable.image-url = 
   (SELECT top 1 image-url from goodlist where child-id = imagetable.object-id) 
WHERE imagetable.image-url = "no"

Autres conseils

Tout d’abord, si la relation parent-enfant est 1: n, pourquoi ne pas simplement ajouter cette information à la même table? par exemple. nom de champ " parentid " (si c'est vide / null c'est seulement un parent). Avantage: vous n'avez pas besoin d'une table supplémentaire et vous pouvez facilement créer une hiérarchie si nécessaire.

Et pour l’image, je suppose que vous voulez l’afficher quelque part dans votre code, mais il devrait être plus facile de modifier le SELECT afin d’obtenir l’image-url du parent; aucune image n’est donnée pour l’enfant. Avantage: pas besoin de mettre à jour la table lorsque vous obtenez de nouvelles entrées et il serait également possible que certaines entrées enfants aient leur propre image (si nécessaire).

edit: vous venez de remarquer votre nouveau commentaire sur la partie de projet open-source, bien sûr, cela rend difficile la modification de la conception de la base de données. Mais il est peut-être encore plus facile de déplacer certains problèmes du côté de la programmation (à moins que cela ne soit également géré par le logiciel open source).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top