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

Duda selección de filas con campos iguales

Estas en el tema de Duda selección de filas con campos iguales en el foro de Mysql en Foros del Web. Hola buenas, resulta que tengo una tabla con tres columnas: Código: ID Discos Estilos 1 1 1 2 2 1 3 2 2 4 3 ...
  #1 (permalink)  
Antiguo 09/10/2009, 17:38
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Duda selección de filas con campos iguales

Hola buenas, resulta que tengo una tabla con tres columnas:

Código:
ID Discos Estilos
1      1        1
2      2        1
3      2        2
4      3        1
5      4        1
6      4        2
7      4        3
en la que ID es único, Discos guarda el ID de los Discos, y Estilos el ID de los Estilos. La tabla sirve para relacionar Discos y Estilos de esta forma:

El Disco 1 tiene un estilo: 1
El Disco 2 tiene dos estilos: 1 y 2
El Disco 3 tiene un estilo: 1
El Disco 4 tiene tres estilos: 1, 2 y 3

¿Cómo hago una consulta para coger sólo los discos que tengan estilo 1 y 2? (Tendría que darme el Disco 2 y el 4 pero no el resto).

Muchas gracias.
  #2 (permalink)  
Antiguo 09/10/2009, 20:36
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Duda selección de filas con campos iguales

Hola Apañero!
Supongo que tambien debes tener una tabla que se llame DISCOS donde guardas el nombre del disco por ejemplo, y otra que se llama ESTILOS donde escribes el nombre del estilo.
Suponiendo que tengas esa info y que la tabla donde combinas el id de un disco con el id de un estilo se llama discos_estilos, podrias hacer la consulta de la siguiente manera:

SELECT discos.nombre
FROM discos, estilos, discos_estilos
WHERE discos_estilos.id_disco = discos.id_disco
AND estilos.id_estilos LIKE 2 OR 4

Con eso deberia andar. Basicamente lo que estas haciendo es diciendole a tu ddbb dos cosas:

1 - Que seleccione el nombre del disco de acuerdo a su ID. Esto se hace en el 1er WHERE y te va a servir para que no te muestre un id de disco sino su nombre.
2 - Que te seleccione aquellos discos que su id_estilo sea 2 o 4

Espero te sirva.
Suerte!
  #3 (permalink)  
Antiguo 10/10/2009, 03:06
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Respuesta: Duda selección de filas con campos iguales

Gracias! Pero necesito que el estilo sea 1 y 2, no 1 ó 2. No me vale LIKE 1 OR 2, necesito hacer algo parecido a un AND pero no lo consigo... Ten en cuenta que lo que he puesto arriba es un ejemplo y luego tendré que buscar Discos que tengan Estilo X, Y, y Z, los que yo quiera buscar, pero los tienen que tener a la vez, no sólo uno de ellos. (no sólo el X o el Y o el Z). Cada Disco puede tener de 1 a 5 estilos guardados en la tabla de la manera que he explicado arriba.

Recuerda que en el ejemplo que he puesto arriba, debería devolverme los discos 2 y 4 que son los únicos que tienen los estilos 1 y 2. Poniendo LIKE 1 OR 2 me devuelve todos los discos.

Última edición por apañero; 10/10/2009 a las 03:15
  #4 (permalink)  
Antiguo 10/10/2009, 09:19
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, 5 meses
Puntos: 2658
Respuesta: Duda selección de filas con campos iguales

Pruébalo así:
Código sql:
Ver original
  1. SELECT
  2.    D.nombre
  3. FROM  
  4.    discos D
  5.    INNER JOIN  discos_estilos ED USING (id_disco)  
  6.    INNER JOIN estilos E  USING(id_estilos)
  7. WHERE  
  8.    E.id_estilos IN (2, 4);
__________________
¿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 10/10/2009, 18:33
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Respuesta: Duda selección de filas con campos iguales

Me sigue sacando tanto los discos con estilo 2 y 4 como los discos con sólo estilo 2 y sólo estilo 4. Necesito por tanto ahora alguna forma de eliminar estos últimos y quedarme sólo con los que tengan 2 y 4.

Última edición por apañero; 10/10/2009 a las 18:39
  #6 (permalink)  
Antiguo 10/10/2009, 18:38
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Respuesta: Duda selección de filas con campos iguales

Ejemplo de salida deseada:

Código:
D_ID EST_ID
1        2
1        4
2        2
3        2
Tras la consulta:
Código:
D_ID EST_ID
1         2
1         4
(los otros 2 discos (ID) no cumplen el tener Estilos 2 y 4)
  #7 (permalink)  
Antiguo 10/10/2009, 18:49
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, 5 meses
Puntos: 2658
Respuesta: Duda selección de filas con campos iguales

Hay varias formas. Una de ellas es establecer que como deben tener dos estilos asignados al mismo disco, el disco debe estar instanciado dos veces en el resultado, si o si:
Código SQL:
Ver original
  1. SELECT
  2.    D.nombre
  3. FROM  
  4.    discos D
  5.    INNER JOIN  discos_estilos ED USING (id_disco)  
  6.    INNER JOIN estilos E  USING(id_estilos)
  7. WHERE  
  8.    E.id_estilos IN (2, 4)
  9. GROUP BY D.nombre
  10. HAVING COUNT(*) = 2;

Otra posibilidad es invocar dos veces la tabla estilos y que empareje los registros de modo de cumplir las dos condiciones si o si:
Código SQL:
Ver original
  1. SELECT DISTINCT
  2.    D.nombre
  3. FROM  
  4.    discos D
  5.    INNER JOIN  discos_estilos ED USING (id_disco)  
  6.    INNER JOIN estilos E1  USING(id_estilos)
  7.    INNER JOIN estilos E2 USING(id_estilos)
  8. WHERE  
  9.    E1.id_estilos = 2 AND E2.id_estilos = 4;
__________________
¿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 11/10/2009, 02:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Duda selección de filas con campos iguales

Y otra más sería usar GROUP_CONCAT
Código sql:
Ver original
  1. SELECT discos, GROUP_CONCAT(estilos) FROM tutabla WHERE estilos IN (2,4) GROUP BY discos ORDER BY discos
te mostrará los estilos de cada disco separados por una coma. Si haces la prueba con PHPMyAdmin deberás hacer un CASTING al campo estilos
Código sql:
Ver original
  1. SELECT discos, GROUP_CONCAT(CAST(estilos AS UNSIGNED)) FROM tutabla WHERE estilos IN (2,4) GROUP BY discos ORDER BY discos
No lo he probado.
  #9 (permalink)  
Antiguo 11/10/2009, 05:25
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Respuesta: Duda selección de filas con campos iguales

Perfecto, eso es lo qye buscaba. Me quedo con "HAVING COUNT(*) = 2;" que me parece lo más sencillo conceptualmente.

Gracias a todos.
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:41.