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

[SOLUCIONADO] Reparar consulta

Estas en el tema de Reparar consulta en el foro de Mysql en Foros del Web. Hola, tengo una consulta que no me funciona bien. Antes le explico las tablas (los nombres cambiados y los datos son ejemplos): objeto id | ...
  #1 (permalink)  
Antiguo 25/04/2014, 14:17
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Reparar consulta

Hola, tengo una consulta que no me funciona bien. Antes le explico las tablas (los nombres cambiados y los datos son ejemplos):

objeto
id | codigo | nombre | obligatorio

1 | a1 | Silla | 0
2 | a2 | Mesa | 0

componentes
id | objeto | herramienta | obligatorio

1 | a1 | 1 | 0
2 | a1 | 2 | 0
3 | a1 | 3 | 1
4 | a2 | 1 | 1

herramientas[U]
id | nombre
1 | martillo
2 | clavos
3 | madera
4 | pegamento



Esto es lo que está devolviendo:

Resultado actual[U]
id | objeto | herramienta
1 | mesa | martillo
1 | mesa | clavo
1 | mesa | madera
1 | mesa | pegamento
2 | silla | martillo
2 | silla | clavo
2 | silla | madera
2 | silla | pegamento


Esto es lo que debe devolver:

Resultado correctol[U]
id | objeto | herramienta
1 | mesa | martillo
2 | silla | clavo
2 | silla | madera
2 | silla | pegamento
  #2 (permalink)  
Antiguo 25/04/2014, 14:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Reparar consulta

Postea la consulta SQL que usas. Sin duda tiene algún defecto en la relación porque te está haciendo un producto cartesiano.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/04/2014, 15:14
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: Reparar consulta

Código MySQL:
Ver original
  1. SELECT componentes.id AS id, componentes.nombre AS nombre, herramientas.name AS herramienta, objetos.obligatorio AS obligatorio
  2. FROM componentes, herramientas, objetos
  3. WHERE componentes.objeto = objetos.codigo
  4. GROUP BY song, herramientas.nombre
  5. ORDER BY song, herramientas.nombre

Última edición por zyxer; 25/04/2014 a las 15:15 Razón: Poner Highlight
  #4 (permalink)  
Antiguo 25/04/2014, 16:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Reparar consulta

Bueno, en realidad es bastante simple en apariencia: Estás invocando tres tablas, pero sólo relacionas dos... Ergo, con la tercera se produce el producto cartesiano.
El JOIN implícito (la coma) sólo funciona como INNER JOIN cuando los campos relacionados entre dos tablas tienen el mismo nombre, que no es el caso.
Cuando son distintos funciona como producto cartesiano.
Código MySQL:
Ver original
  1. SELECT C.id, C.nombre, H.name herramienta, O.obligatorio
  2. FROM componentes C
  3.     INNER JOIN herramientas H ON C.herramienta = H.id
  4.     INNER JOIN objetos O ON C.objeto = O.codigo
  5. GROUP BY song, H.nombre
  6. ORDER BY song, H.nombre
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/04/2014, 16:48
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: Reparar consulta

Ok, y una última cosa. Cómo hago para que al ordenar me ponga los que son O.obligatorio = 1 antes de los que son O.obligatorio = 0?

Última edición por zyxer; 25/04/2014 a las 17:03
  #6 (permalink)  
Antiguo 25/04/2014, 17:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Reparar consulta

Código MySQL:
Ver original
  1. ...
  2. ORDER BY O.obligatorio DESC,  song ASC, H.nombre ASC
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/04/2014, 17:39
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: Reparar consulta

Perdón, no me había expresado bien, es ordenado por objeto y en segundo lugar por O.obligatorio DESC. Y entiendo como ponerlo en segundo lugar, pero hay un conflicto con las herramientas que se usan más para más de un objeto y tienen O.obligatorio = 1 para un objeto, pero no para el otro.

Ejemplo: La herramienta martillo no es obligatorio para un objeto pero sí para otro, y sale primero en las que no es obligatorio porque lee el O.obligatorio = 1 para el otro objeto.
  #8 (permalink)  
Antiguo 25/04/2014, 22:09
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: Reparar consulta

Hermano, discúlpame... pero me acabo de dar cuenta de que la cláusula que me diste estuvo funcionando bien desde el principio, lo que estaba mal eran los datos de la base de datos. Lo siento y verdaderamente, gracias por por ayudarme a corregir la consulta y por enseñarme; pues aunque había leído el INNER JOIN antes, no fue hasta que me corregiste que REALMENTE entendí la manera correcta de utilizarlo.

[OFFTOPIC]Ya veo que tienes razón con lo que dice el mensaje de tu firma.[/OFFTOPIC]

Etiquetas: reparar, 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 08:52.