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

[SOLUCIONADO] Sentencia mysql con doble select

Estas en el tema de Sentencia mysql con doble select en el foro de Bases de Datos General en Foros del Web. Buenas, No sé cómo construir la siguiente setencia. Tengo las dos siguientes tablas: Quiero listar todos los artículos con su stock y color, y sólo ...
  #1 (permalink)  
Antiguo 14/08/2015, 05:49
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Sentencia mysql con doble select

Buenas,
No sé cómo construir la siguiente setencia. Tengo las dos siguientes tablas:



Quiero listar todos los artículos con su stock y color, y sólo una prenda, es decir:
- Articulo1 - 3 - rojo - Pantalón
- Articulo2 - 5 - verde - Pantalón
....

Con esta sentencia los artículos, lógicamente, salen repetidos:
Código MySQL:
Ver original
  1. SELECT * FROM articulos, prendas WHERE articulos.campo1 = prendas.campo1

He intentado con UNION pero me da error al no coincidir columnas. Podría alguien orientarme?

Muchas gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #2 (permalink)  
Antiguo 14/08/2015, 06:25
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Respuesta: Sentencia mysql con doble select

Buenas,
He encontrado esta forma:

Código MySQL:
Ver original
  1. SELECT campo1, stock, color,
  2.  (SELECT campo2 FROM prendas WHERE articulos.campo1 = prendas.campo1 LIMIT 1)
  3.  FROM articulos

No sé si hay una solución más óptima.
Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Última edición por gnzsoloyo; 14/08/2015 a las 06:55
  #3 (permalink)  
Antiguo 14/08/2015, 07:00
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: Sentencia mysql con doble select

Estás compliando demasiado la consulta, y no estás acudiendo a los manuales básicos...

Usa INNER JOIN.
Código MySQL:
Ver original
  1. SELECT A.campo1, A.stock, A.color, P.campo1
  2. FROM articulos INNER JOIN prendas ON A.campo1 = P.campo1;

De todos modos me parece que la estructura que describes no está bien.
Si Articulo1 tiene 3 de stock, no puede ser al mismo tiempo pantalon, zapato y abrigo... Son tres artículos diferentes, y el stock de un articulo debe ser por cada articulo distinto.

No me cierra.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 14/08/2015, 07:46
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Respuesta: Sentencia mysql con doble select

Gracias gnsoloyo, no hagas caso al contenido de las tablas, sólo son para el ejemplo.
Tal com planteas tu la consulta, devuelve todas las prendas y yo sólo quiero una, la primera
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #5 (permalink)  
Antiguo 14/08/2015, 07:52
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: Sentencia mysql con doble select

Ok, primero, no nos pongas ejemplos que no sean los reales. Tienden a generar respuestas ineficientes, incorrectas y nos hacen perder tiempo analizando algo que no existe.

Segundo, respecto a "la primera", ¿la primera en base a qué concepto? ¿La primera que salga? ¿La mayor en algo?
Si lo piensas, lo único que necesitarías es poner un WHERE para obtener algo mas definido, porque la consulta conceptualmente es correcta. Sólo requiere poner
Código MySQL:
Ver original
  1. ...
  2. WHERE P.campo2 = 'Pantalón'
mas lo que haga falta para definir que es eso "primero"...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/08/2015, 08:18
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Respuesta: Sentencia mysql con doble select

Llevas razón, veo que el ejemplo no ha sido correcto pues no has entendido lo que busco. Cuando esté delante de un pc pondré un ejemplo real.
Y perdón por haberte hecho perder el tiempo
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #7 (permalink)  
Antiguo 14/08/2015, 08: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: 17 años
Puntos: 2658
Respuesta: Sentencia mysql con doble select

Ok.

¿Y en cuanto a lo "primero"? ¿Qué es al final lo que defines como "primero"?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 14/08/2015, 11:18
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Respuesta: Sentencia mysql con doble select

Aquí van las tablas reales:


Por cada referencia de la tabla1 sólo quiero mostrar una foto (tabla2).
Haciéndolo con INNER JOIN o WHERE, como me comentas, devuelve por cada referencia, todas las fotos.

La manera que he encontrado que sólo me devuelva la primera es así:

Código MySQL:
Ver original
  1. SELECT t_un.referencia, (SELECT t_fotos.foto FROM t_fotos WHERE t_un.referencia = t_fotos.referencia LIMIT 1) FROM t_un

No sé si hay una manera más sencilla para realizar dicha consulta.
Espero haberme expresado mejor ahora.

Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #9 (permalink)  
Antiguo 14/08/2015, 11:34
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: Sentencia mysql con doble select

Código MySQL:
Ver original
  1. SELECT U.referencia, F.foto
  2. FROM t_un U INNER JOIN t_fotos F ON U.referencia = F.referencia
  3. GROUP BY U.referencia;
Ahora bien, si quieres que sea la última foto, suponiendo que exista un "ID" de foto:
Código MySQL:
Ver original
  1. SELECT referencia, foto
  2.     (SELECT U.referencia, F.foto
  3.     FROM t_un U INNER JOIN t_fotos F ON U.referencia = F.referencia
  4.     ORDER BY ID DESC) T1
  5. GROUP BY referencia;

Y si quieres que devuelva una foto diferente por cada vez que lo ejecutas:
Código MySQL:
Ver original
  1. SELECT referencia, foto
  2.      (SELECT U.referencia, F.foto
  3.     FROM t_un U INNER JOIN t_fotos F ON U.referencia = F.referencia
  4.     ORDER BY RAND()) T1
  5. GROUP BY referencia;

Ten en cuenta una cosa: Es muy mala idea poner subconsultas en el SELECT, porque afecta la performance de la consulta principal. AL ponerlo allí se ejecuta una vez por cada registro devuelto de la principal, y suponiendo que tuvieses 1200 referencias, se ejecutaría la búsqueda de fotos... 1.200 veces.
¿Te parece buena idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 14/08/2015, 13:07
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Respuesta: Sentencia mysql con doble select

Me parece una clase magistral. Muchísimas gracias. De todas maneras me ha entrado una duda.
Tal como dices, poner una subconsulta en el SELECT afecta negativamente el rendimiento de la consulta principal, en cambio, he comprobado en phpmyadmin cuanta tarda cada consulta, y la propuesta por ti tarda más. Por qué crees que puede pasar?



MUchas gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Última edición por mblascog; 14/08/2015 a las 13:23
  #11 (permalink)  
Antiguo 19/08/2015, 08:12
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: Sentencia mysql con doble select

Cita:
y la propuesta por ti tarda más.
1) ¿Cuál de las tres?

2) Prueba con 1.000.000 de registros y hablamos de performance.
Con unos miles no alcanza para que veas la diferencia, y sin conocer los datos reales, sólo puedo hacer suposiciones, entre las que se destacaría que pueden ser tablas MyISAM, con lo que no existirían los indices FK...
También peude deberse al exceso de cardinalidad (baja selectividad de las relaciones), y el ORDER BY, que es por definición antiperformántico.

Hay mucha tela para cortar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 19/08/2015, 08:50
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 10 meses
Puntos: 4
Respuesta: Sentencia mysql con doble select

Vale! Confié en tu explicación y la apliqué. Fue sólo la curiosidad de saber el tiempo que tardaba cada sentencia y me sorprendió.
La verdad es que mi tabla tiene muy pocos registros.
Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Etiquetas: mysql
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 23:01.