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

Consulta SQL complicada

Estas en el tema de Consulta SQL complicada en el foro de Mysql en Foros del Web. Tengo esta consulta SQL original que devuelve los resultados de una búsqueda: SELECT DISTINCT p.products_image, p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, IF (s.status, s.specials_new_products_price, NULL ) AS ...
  #1 (permalink)  
Antiguo 15/04/2008, 05:39
 
Fecha de Ingreso: abril-2008
Mensajes: 5
Antigüedad: 16 años
Puntos: 0
Sonrisa Consulta SQL complicada

Tengo esta consulta SQL original que devuelve los resultados de una búsqueda:

SELECT DISTINCT p.products_image, p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) AS specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) AS final_price FROM products p LEFT JOIN specials s ON p.products_id = s.products_id, products_description pd, categories c, products_to_categories p2c WHERE p.products_status = '1' AND p.products_id = pd.products_id AND pd.language_id = '3' AND p.products_id = p2c.products_id AND p2c.categories_id = c.categories_id AND ((pd.products_name LIKE '%gordo%' OR pd.products_description LIKE '%gordo%')) ORDER BY pd.products_name DESC

IMPLEMENTACION:
He creado una tabla nueva con tags para los artículos:

*Campos:
tags.product_id ___________ tags.tag
1____________________________nuevo
1____________________________gordo
1____________________________especial
2____________________________especial
2____________________________gordo
3____________________________usado

Intento combinar la consulta original con la nueva tabla para obtener en el resultado los nuevos valores de la siguiente manera:

SELECT DISTINCT p.products_image, t.tag, p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, IF s.status, s.specials_new_products_price, NULL) AS specials_new_products_price, IF (s.status, s.specials_new_products_price, p.products_price) AS final_price FROM products p, tags t LEFT JOIN specials s ON p.products_id = s.products_id, products_description pd, categories c, products_to_categories p2c WHERE p.products_status = '1' AND p.products_id = pd.products_id AND p.products_id = t.product_id AND pd.language_id = '3' AND p.products_id = p2c.products_id AND p2c.categories_id = c.categories_id AND ((pd.products_name LIKE '%gordo%' OR pd.products_description LIKE '%gordo%' OR t.tag LIKE '%gordo%')) ORDER BY pd.products_name DESC

PROBLEMA:
Se repiten los registros obtenidos un montón de veces a pesar que SELECT incorpora la cláusula DISTINCT.
EJ:
... tag__________products_id______products_name...
nuevo___________1_______________Manillar cromado
gordo____________1______________Manillar cromado
especial__________1______________Manillar cromado
gordo____________2______________Horquilla


Desde ya muy agradecido...
  #2 (permalink)  
Antiguo 17/04/2008, 00:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Re: Consulta SQL complicada

Cita:
Iniciado por betus Ver Mensaje

Intento combinar la consulta original con la nueva tabla para obtener en el resultado los nuevos valores de la siguiente manera:

SELECT DISTINCT p.products_image, t.tag, p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, IF s.status, s.specials_new_products_price, NULL) AS specials_new_products_price, IF (s.status, s.specials_new_products_price, p.products_price) AS final_price FROM products p, tags t LEFT JOIN specials s ON p.products_id = s.products_id, products_description pd, categories c, products_to_categories p2c WHERE p.products_status = '1' AND p.products_id = pd.products_id AND p.products_id = t.product_id AND pd.language_id = '3' AND p.products_id = p2c.products_id AND p2c.categories_id = c.categories_id AND ((pd.products_name LIKE '%gordo%' OR pd.products_description LIKE '%gordo%' OR t.tag LIKE '%gordo%')) ORDER BY pd.products_name DESC

PROBLEMA:
Se repiten los registros obtenidos un montón de veces a pesar que SELECT incorpora la cláusula DISTINCT.
EJ:
... tag__________products_id______products_name...
nuevo___________1_______________Manillar cromado
gordo____________1______________Manillar cromado
especial__________1______________Manillar cromado
gordo____________2______________Horquilla

Si hubieras dejado SELECT DISTINCT p.products_image y no hubieras puesto ningún otro campo detrás separado por comas, el resultado hubiera sido el esperado por lo que se refiere al DISTINCT, pues, según creo, el DISTINCT se vería afectado también por lo que sigue, en tu caso esos otros campos, y el distinct pierde el efecto que deseas. Pero en realidad, ese no es tu problema, sino el uso que haces de las relaciones en el LEFT JOIN
LEFT JOIN [/COLOR]specials s ON p.products_id = s.products_id, products_description pd, categories c, products_to_categories p2c [COLOR="purple"]WHERE
en el ON tienes que poner la equivalencia de dos campos (1 campo de una tabla con 1 de otra y no de 1 un campo de una tabla con 4 tablas, que es lo que creo has hecho).
Si quieres establecer más relaciones tendrás que enlazarlas con otros LEFT JOIN o tal vez mejor JOIN en tu caso (aunque para determinarlo tendrías que decirnos qué quieres sacar exactamente y la estructura de tus tablas), y siempre con campos de las tablas que estén relacionados, y 1 a 1; luego otro JOIN en el que otro campo de una de las tablas anteriores se relacione con otro de la siguiente y así sucesivamente; si no, acabarás haciendo un producto cartesiano relacionando todo con todo, o como parece estar ocurriéndote, uno con varios, y esos datos no te servirán de nada.
Es decir, respecto a las siguientes tablas no estableces relación con ninguna de las anteriores ni entre ellas, algo que tendrás que hacer si no quieres multiplicar los resultados...
products_description pd, categories c, products_to_categories p2c
con JOIN deberás unir por ejemplo el campo de products_description, imagino que su id, relacionado con otro campo de otra tabla, no sé cuál..., y luego otro inner join, y así sucesivamente.
A ver si es eso...

Última edición por jurena; 17/04/2008 a las 01:05
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 02:50.