Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta SQL

Estas en el tema de Consulta SQL en el foro de Mysql en Foros del Web. Hola a todos. Intentaré explicarme lo mejor posible para un problema que me trae de cabeza. Estoy creando una web de comercio electrónico con Joomla ...
  #1 (permalink)  
Antiguo 18/06/2013, 13:52
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Consulta SQL

Hola a todos.

Intentaré explicarme lo mejor posible para un problema que me trae de cabeza.

Estoy creando una web de comercio electrónico con Joomla y he importado todos los productos con sus respectivas imágenes de forma masiva. El problema radica en que éstas imágenes no se han guardado con orden alguno y , en casos en que un producto tiene varias imágenes, la imagen principal se muestra de forma aleatoria. He buscado en la BBDD y he dado con la tabla en la que debo lanzar una consulta, creo que sé lo que debo hacer pero no "como" debo hacerla (mis conocimientos de SQL son bastante limitados). Voy a intentar detallarlo al máximo:

La estructura de la tabla es la siguiente:

- id
-virtuemart_product_id
-virtuemart_media_id
-ordering

Pongamos un ejemplo, dos productos, uno con 2 y otro con 3 imágenes cuyos valores corresponderían con las 4 columnas anteriores:

16727, 376, 10000325, 0
14928, 376, 10000326, 0
15874, 377, 10000424, 0
14736, 377, 10000425, 0
18299, 377, 10000423, 0

La idea es modificar la columna "ordering" en función del id de producto y una vez hecho esto, del id de la imagen para que quede de la siguiente manera:

16727, 376, 10000325, 1
14928, 376, 10000326, 2
18299, 377, 10000423, 1
15874, 377, 10000424, 2
14736, 377, 10000425, 3

Sé como realizar la ordenación pero no como decirle que asigne valor "1" al campo ordering solo en primer caso, luego 2 si se repite "virtuemart_product_id" y así sucesivamente.

Agradezco cualquier ayuda.

Saludos.
  #2 (permalink)  
Antiguo 18/06/2013, 13:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Consulta SQL

que version de sql server manejas??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 18/06/2013, 14:01
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

Hola Libras

Hago las consultas SQL a través del panel de phpMyAdmin versión 3.4.5
  #4 (permalink)  
Antiguo 18/06/2013, 14:02
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Consulta SQL

pero usas sql server o usas mysql?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 18/06/2013, 14:03
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

Ah perdón, es MySQL
  #6 (permalink)  
Antiguo 18/06/2013, 14:04
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

Perdón, ahora que me has preguntado eso me doy cuenta que no he puesto mi consulta en el foro correcto, ¿hay alguna forma de cambiarlo de foro o publico esta consulta otra vez en el foro de MySQL?
  #7 (permalink)  
Antiguo 18/06/2013, 14:06
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Consulta SQL

para mysql puedes usar esto:

http://www.xaprb.com/blog/2005/09/27...mber-function/

saludos!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 18/06/2013, 14:24
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

Muchas gracias Libras, creo que hemos avanzado bastante pero estoy a medias. Te cuento, he lanzado la siguiente consulta:

Cita:
SELECT l.virtuemart_product_id, l.virtuemart_media_id, COUNT( * ) AS ordering
FROM `virtuemart_product_medias` AS l
LEFT OUTER JOIN `virtuemart_product_medias` AS r ON l.virtuemart_product_id = r.virtuemart_product_id
AND l.virtuemart_media_id >= r.virtuemart_media_id
GROUP BY l.virtuemart_product_id, l.virtuemart_media_id
Si no me equivoco eso es una tabla temporal (corrígeme si no es así), veo los valores y efectivamente parece que consigo lo que buscaba, pero ¿ahora como debo hacer para introducirlo en la tabla virtuemart_product_medias?
  #9 (permalink)  
Antiguo 18/06/2013, 14:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Consulta SQL

este...pues haces un update a tu tabla

algo asi:
Código MySQL:
Ver original
  1. update virtuemart_product_medias
  2. set ordering=t1.ordering
  3. (
  4. SELECT l.virtuemart_product_id, l.virtuemart_media_id, COUNT( * ) AS ordering
  5. FROM `virtuemart_product_medias` AS l
  6. LEFT OUTER JOIN `virtuemart_product_medias` AS r ON l.virtuemart_product_id = r.virtuemart_product_id
  7. AND l.virtuemart_media_id >= r.virtuemart_media_id
  8. GROUP BY l.virtuemart_product_id, l.virtuemart_media_id
  9. ) as t1 where virtuemart_product_medias.id=t1.id
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por gnzsoloyo; 18/06/2013 a las 17:59
  #10 (permalink)  
Antiguo 18/06/2013, 14:41
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

Muchas gracias por tantas molestias, pero me da el siguiente error:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from (SELECT l.virtuemart_product_id, l.virtuemart_media_id, COUNT( * ) AS order' at line 3

He revisado la sentencia y no he encontrado fallo pero como he dicho antes en esto estoy muy verde...
  #11 (permalink)  
Antiguo 18/06/2013, 14:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Consulta SQL

no pues eso es de mysql jejeje asi como te pase el query es para hacer un update con un select desde sql server :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 18/06/2013, 15:41
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

No he conseguido que funcione bien pero te agradezco muchísimo tu tiempo. He lanzado la siguiente consulta:

Código MySQL:
Ver original
  1. UPDATE bfb9s_virtuemart_product_medias dest, (SELECT l.virtuemart_product_id, l.virtuemart_media_id, COUNT( * ) AS ordering
  2. FROM `bfb9s_virtuemart_product_medias` AS l
  3. LEFT OUTER JOIN `bfb9s_virtuemart_product_medias` AS r ON l.virtuemart_product_id = r.virtuemart_product_id
  4. AND l.virtuemart_media_id >= r.virtuemart_media_id
  5. GROUP BY l.virtuemart_product_id, l.virtuemart_media_id) src
  6.   SET dest.ordering = src.ordering

Pero muestra valor 1 para todas las filas de la columna ordering y creo, por lo poco que sé, que ahí falta un left join para que funcione correctamente, ¿sabes como debería utilizarlo? O si te resulta muy complicado para MySQL pido ayuda en ese foro.

Muchas gracias de verdad.

Última edición por gnzsoloyo; 18/06/2013 a las 17:58
  #13 (permalink)  
Antiguo 18/06/2013, 19:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta SQL

Movido a MySQL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 18/06/2013, 19:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta SQL

Por empezar, como UPDATE está mal escrito. La sitaxis base es:
Código MySQL:
Ver original
  1. UPDATE tabla
  2. SET campo = valor, ...
  3. WHERE condiciones
Luego, MySQL no admite que consultes y actualices la misma tabla en la misma consulta. Es por un tema de seguridad de procesos, pero la idea es que puedes terminar por actualizar el mismo campo que estás consultando, por lo que terminas cortando la rama sobre la que estás parado... cosa que sería un desastre.
En general, el problea que te aqueja es relativamente sencillo de resolver, pero yo le veo dos vías:
1) Un SP y usando un CURSOR, lo que permitiría realizar obtener la tabla ordenada y reinicar el contador por cada cambio de producto.
2) Usar una tabla TEMPORARY para ubicar las numeraciones y luego un simple UMPDATE con INNER JOIN permitiría hacer la tarea.

Pero... ¿para qué quieres renumerarla, si ya tienen un orden definido por el ingreso? Si es para que aparezca el numero listado, no necesitas ni ese campo, ni ningún otro. Lo puedes obtener simplemente en la misma consulta donde recuperas la lista.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 18/06/2013, 19:46
 
Fecha de Ingreso: junio-2012
Mensajes: 46
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Consulta SQL

Hola gnzsoloyo.

Puse el update que finalmente hice y con el que conseguí mi propósito pero creo que lo borraste para mover este que puse inicialmente en el lugar que no correspondía. El update era el siguiente:

Cita:
UPDATE bfb9s_virtuemart_product_medias AS u
JOIN
(SELECT l.virtuemart_product_id, l.virtuemart_media_id, COUNT( * ) AS ordering
FROM `bfb9s_virtuemart_product_medias` AS l
LEFT OUTER JOIN `bfb9s_virtuemart_product_medias` AS r ON l.virtuemart_product_id = r.virtuemart_product_id
AND l.virtuemart_media_id >= r.virtuemart_media_id
GROUP BY l.virtuemart_product_id, l.virtuemart_media_id) AS tmp
ON tmp.`virtuemart_product_id` = u.`virtuemart_product_id`
AND tmp.`virtuemart_media_id` = u.`virtuemart_media_id`
SET u.ordering = tmp.ordering
Todo esto surge porque introduje todas las imágenes relacionadas con los productos de forma masiva, y no sé por que razón el campo ordering obtenía valor 0 para cualquier fila. Ésto era un problema, ya que Joomla obtiene la imagen principal a través del orden de imágenes de producto (cuando ésta acción se realiza desde el panel de administración sí se guarda con un orden determinado).

Saludos.
  #16 (permalink)  
Antiguo 18/06/2013, 19:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta SQL

Cita:
Puse el update que finalmente hice y con el que conseguí mi propósito pero creo que lo borraste para mover este que puse inicialmente en el lugar que no correspondía.
Si ya estaba movido, debiste postear esa solución en el mismo thread, y no postear uno nuevo para el mismo fin.
Las políticas de uso de FDW específicamente indican que se eliminarán temas repetidos o duplicados, sin avisar.

Cita:
y no sé por que razón el campo ordering obtenía valor 0 para cualquier fila.
Si no le asignas un valor definido cuando haces la migración de los datos, el valor será cero a menos que sea un autoincremental.
Por lo demás, no me terminas de explicar cuál es la utilidad de esa columna en este caso:
Cita:
16727, 376, 10000325, 0
14928, 376, 10000326, 0
15874, 377, 10000424, 0
14736, 377, 10000425, 0
18299, 377, 10000423, 0
Cuando eso mismo se puede obtener directamente en el SELECT, como podrás ver una explicación en las FAQs. Es algo elaborado, pero se puede hacer.

Por ciero: Por favor, usa los HIGHLIGHTS de la ventana de edición y etiqueta correctamente los códigos según lo que les corresponda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: sql, sql-server, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:00.