Pregunta

Lo siento si el título no es tan descriptivo como debería ser, pero es un poco difícil explicar en una oración lo que estoy tratando de hacer;).

Tengo una tabla que vincula los objetos principales con sus respectivos hijos. Y tengo otra tabla con todos los objetos (padres e hijos) con sus respectivas imágenes. Sin embargo, la imagen solo está configurada para los objetos padres. Me gustaría actualizar esta última tabla y configurar la imagen del niño la misma imagen que ya está configurada para su padre. Además, como hay más de una imagen para cada objeto, me gustaría establecer una en particular, que puedo saber en función de una columna de atributos.

Mis tablas se parecen a:

Tabla de relaciones

id de niño

identificación del padre

ImageTable

id-objeto

id. de atributo

imagen-url

Y aquí va un ejemplo para aclarar las cosas:

Tabla de relaciones

id-niño | identificación del padre

3 | 1

4 | 1

5 | 2

ImageTable

id-objeto | ID de atributo | image-url

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | no

3 | badimage | no

4 | goodimage | no

4 | badimage | no

5 | goodimage | no

5 | badimage | no

Entonces, me gustaría establecer las imágenes de los objetos 3, 4 y 5 (secundarios) a sus respectivas imágenes principales, pero a las 'correctas', es decir, las imágenes con 'buena imagen' como id de atributo.

Al final debería verse así:

1 | goodimage | image1.jpg

1 | badimage | image1b.jpg

2 | goodimage | image2.jpg

2 | badimage | image2b.jpg

3 | goodimage | image1.jpg

3 | badimage | no

4 | goodimage | image1.jpg

4 | badimage | no

5 | goodimage | image2.jpg

5 | badimage | no

En realidad, no me importa si 'badimage' también está configurado, pero el importante es 'goodimage'.

He intentado 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'

pero no funciona ya que no es la sintaxis SQL correcta. No sé si debería usar una variable (nunca usé una) o si esto se puede hacer con una sola oración SQL.

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

¿

algo como esto?

NOTAS:

Esto podría fusionarse en uno    declaración no subconsulta pero estaba    perezoso.

No probé, espero errores tipográficos

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

Otros consejos

En primer lugar, si la relación entre padre e hijo es 1: n, ¿por qué no agrega esa información a la misma tabla? p.ej. nombre de campo " parentid " (si está vacío / nulo es solo un padre). Beneficio: no necesita una tabla adicional y puede crear fácilmente una jerarquía si es necesario.

Y para la imagen, supongo que desea mostrar esto en algún lugar de su código, pero debería ser más fácil simplemente modificar SELECT para obtener la url de la imagen del padre si no se proporciona ninguna imagen para el hijo. Beneficio: no es necesario actualizar la tabla cuando obtiene nuevas entradas y también sería posible que algunas entradas secundarias tengan su propia imagen (si es necesario).

editar: acabo de notar su nuevo comentario sobre la parte del proyecto de código abierto, por supuesto, esto hace que sea difícil cambiar el diseño de la base de datos. Pero quizás aún sea más fácil trasladar algunos de los problemas al lado de la programación (a menos que esto también sea manejado por el software de código abierto).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top