Pergunta

Desculpe se o título não é tão descritivo como deveria ser, mas é meio difícil de explicar em uma frase o que eu estou tentando fazer;).

Eu tenho uma tabela que as ligações objetos pai com seus respectivos criança. E eu tenho outra tabela com todos os objetos (pais e dos childs) com suas imagens respectives. No entanto, a imagem é apenas um conjunto para os objetos pais. Gostaria de atualizar esta última mesa e definir a imagem da criança a mesma imagem que já está definido para seu pai. Além disso, como há mais de uma imagem para cada objeto, eu gostaria de definir um em especial, que eu posso saber com base em uma coluna de atributo.

As minhas mesas algo como:

RelationTable

criança-id

pai-id

ImageTable

object-id

atributo-id

image-url

E aqui vai um exemplo, a fim de esclarecer as coisas:

RelationsTable

criança-id | pai-id

3 | 1

4 | 1

5 | 2

ImageTable

object-id | atributo-id | image-url

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | Não

3 | badimage | Não

4 | goodimage | Não

4 | badimage | Não

5 | goodimage | Não

5 | badimage | Não

Então, eu gostaria de definir as imagens de objetos 3, 4 e 5 (as crianças) para suas respectivas imagens pais, mas para os 'corretas', isto é as imagens com 'goodimage' como atributo-id.

No final ele deve ser parecido:

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | image1.jpg

3 | badimage | Não

4 | goodimage | image1.jpg

4 | badimage | Não

5 | goodimage | image2.jpg

5 | badimage | Não

Na verdade, eu não me importo se 'badimage' é definido como bem, mas o importante é 'goodimage'.

Eu tenho tentado algo como:

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'

Mas não é trabalhar uma vez que não é a sintaxe SQL correta. Eu não sei se eu deveria usar uma variável (nunca usado) ou se isso pode ser feito com apenas uma frase SQL.

Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

algo assim?

NOTAS:

Esta poderia ser fundidos em um declaração não subconsulta mas eu estava preguiçoso.

Eu não teste, esperar erros

;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"

Outras dicas

Em primeiro lugar, se a relação entre pai e filho é 1: n, por que você não basta adicionar essa informação para a mesma mesa? por exemplo. fieldname "parentid" (se ele está vazio / null é apenas um dos pais). Benefício:. Você não precisa de uma tabela adicional e pode facilmente criar uma hierarquia, se necessário

E para a imagem, eu acho que você quer mostrar este em algum lugar no seu código, mas deve ser mais fácil simplesmente modificar o SELECT para obter a imagem-url do pai há imagem é dado para a criança. Benefício:. Não há necessidade de atualizar a tabela quando você começa novas entradas e também seria possível para algumas entradas criança a ter sua própria imagem (se necessário)

edit: só ??notei o seu novo comentário sobre a parte do projeto de código aberto, é claro que isso faz com que seja difícil de alterar o design de banco de dados. Mas talvez seja ainda mais fácil mover alguns dos problemas para o lado de programação (a menos que isso é tratado pelo software de código aberto também).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top