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

Obtener registros con mismo valor en columna pero diferente en otra

Estas en el tema de Obtener registros con mismo valor en columna pero diferente en otra en el foro de Mysql en Foros del Web. Bunos dias; Estoy intentando sacar de una tabla los registros con campo1=1 y campo1=2 pero que tengan mismo campo2 . A ver si me explico... ...
  #1 (permalink)  
Antiguo 28/07/2011, 02:46
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 10 meses
Puntos: 8
Pregunta Obtener registros con mismo valor en columna pero diferente en otra

Bunos dias;

Estoy intentando sacar de una tabla los registros con campo1=1 y campo1=2 pero que tengan mismo campo2 .

A ver si me explico... tengo esta tabla
Código:
CREATE TABLE IF NOT EXISTS lloc (
  id_lloc int not null,
  n_tarea int NOT NULL,
 ) ENGINE=InnoDB;


//luego inserto los registros

(1,1),
(1,2),
(1,3),
(2,1),
(2,2),
(3,1);
Lo que quiero es sacar los n_tarea que tengan id_lloc=1 y id_lloc=2.Por ejemplo debería devolver n_tarea={1,2} por que el n_tarea 1 y 2 esta en id_lloc=1 e id_lloc=2.
He provado con exist... pero no lo consigo...

Código:
SELECT * FROM lloc l where l.id_lloc=2 and exists(select * from lloc l where l.lloc=1);
A ver si alguien me echa un cable...

Un saludo
  #2 (permalink)  
Antiguo 28/07/2011, 04:11
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: Obtener registros con mismo valor en columna pero diferente en otra

Código MySQL:
Ver original
  1. FROM lloc l
  2. WHERE l.id_lloc=2;
__________________
¿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 28/07/2011, 06:40
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 10 meses
Puntos: 8
Respuesta: Obtener registros con mismo valor en columna pero diferente en otra

Hola gnzsoloyo gracias por el interés, no veo como me puede ayudar esa sentencia,he estado mirando en el manual de mysql sobre "DISTINCT" y ya de paso "HAVING" y no consigo que me funcione correctamente.
Lo que quiero es devolver los resultados que contengan los dos id_lloc proporcionados y la misma n_tarea excluendo las n_tareas que estén en un id_lloc pero no en el otro...

otro ejemplo a ver si lo simplificamos...

Código:
$consulta1=Select n_tarea form lloc where id_lloc=1

$consulta2=Select n_tarea form lloc where id_lloc=2

$array_nuevo="los que estan en $consulta2 y $consulta1";
Se me ocurre como hacerlo con php, recojo los 2 array y luego los comparo... algo parecido a

Código PHP:
while($registre=array_shift($consulta1)){
if(
in_array($registre,$consulta2)){
$aux[]=$registre
Pudiendo simplificar, creo que lo acertado es hacerlo con una consulta.
Gracias por el interés nuevamente
Un saludo
  #4 (permalink)  
Antiguo 28/07/2011, 07:50
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: Obtener registros con mismo valor en columna pero diferente en otra

Es todo cuestión de la lógica aplicada:
Código MySQL:
Ver original
  1. SELECT L1.*
  2. FROM lloc L1 INNER JOIN lloc L2 ON L1.id_lloc=L2id_lloc
  3. WHERE L1.n_tarea  = 1 and L2.id_lloc = 2);

PostData: En este foro las normas dicen que no se debe poner código de programación. Sólo SQL y temas de BBDD (no incluyen las sentencias de PHP para MySQL, eso es programación)
__________________
¿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 28/07/2011, 08:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Obtener registros con mismo valor en columna pero diferente en otra

Hola HarryP:

No sé si entendí correctamente cual es el problema, pero veamos si es más o menos esto. Según lo que te entendí hay que buscar todas las n_tareas que tengan asociadas los id_lloc 1 y 2.

Con los registros que pones de ejemplo entonces la consulta resultante debería ser algo como esto:

Código:
n_tarea
-----------------
1
2
Para el caso de la n_tarea = 1 tienes los siguientes datos:

Código:
n_tarea  id_lloc
-------  -------
      1        1
      1        2
      1        3
Aquí se observa que tiene tanto el id_lloc 1 y 2 (además de un 3, pero que no afecta el resultado)

Para la n_tarea_2 tenemos los siguientes datos:

Código:
n_tarea  id_lloc
-------  -------
      2        1
      2        2
Es decir también cumple con la condición.

Para el caso de la n_tarea 3 tenemos los siguientes datos:

Código:
n_tarea  id_lloc
-------  -------
      3        1
Este n_tarea no cumple con la condición, pues no tiene la id_lloc = 2

Si estoy en lo correcto y esto es lo que necesitas, lo puedes obtener de la siguiente manera:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE IF NOT EXISTS lloc (
  2.     ->   id_lloc INT NOT NULL,
  3.     ->   n_tarea INT NOT NULL
  4.     ->  ) ENGINE=INNODB;
  5. Query OK, 0 rows affected (0.09 sec)
  6.  
  7. mysql> INSERT INTO lloc VALUES (1,1),(1,2),(1,3),(2,1),(2,2),(3,1);
  8. Query OK, 6 rows affected (0.07 sec)
  9. Records: 6  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from lloc;
  12. +---------+---------+
  13. | id_lloc | n_tarea |
  14. +---------+---------+
  15. |       1 |       1 |
  16. |       1 |       2 |
  17. |       1 |       3 |
  18. |       2 |       1 |
  19. |       2 |       2 |
  20. |       3 |       1 |
  21. +---------+---------+
  22. 6 rows in set (0.00 sec)
  23.  
  24. mysql> SELECT n_tarea FROM lloc
  25.     -> WHERE id_lloc IN (1,2) GROUP BY n_tarea HAVING COUNT(*) = 2;
  26. +---------+
  27. | n_tarea |
  28. +---------+
  29. |       1 |
  30. |       2 |
  31. +---------+
  32. 2 rows in set (0.00 sec)

Dale un vistazo para ver si es lo que necesitas.

Saldos
Leo
  #6 (permalink)  
Antiguo 28/07/2011, 09:18
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 10 meses
Puntos: 8
Respuesta: Obtener registros con mismo valor en columna pero diferente en otra

Hola leonardo_josue menudo currazo te has pegado ajaja ... muchas gracias por tu tiempo, te lo agradezco muchisimo. Vamos al lio...

La consulta retorna lo deseado, pero parandome a pensar estoy viendo que cuenta las veces que se repite el campo n_tarea, por lo que al no ser clave primaria los dos campos, podrían repetirse registros que coincidiesen con n_tarea que y alterasen el resultado.

Por poner un ejemplo
Código:
CREATE TABLE IF NOT EXISTS lloc (
  id_lloc int not null,
  n_tarea int NOT NULL,
 campo_X int not null
 ) ENGINE=InnoDB;


//luego inserto los registros

(1,1,A),
(1,2,A),
(1,3,A),
(1,3,B),
(2,1,A),
(2,2,A),
(3,1,A);
Si ahora pregunto

Cita:
SELECT n_tarea FROM lloc
WHERE id_lloc IN (1,2) GROUP BY n_tarea HAVING COUNT(*) = 2;
Va a contar 2 veces el registro (1,3) por cumplir la condición.
Por lo que la consulta de gnzsoloyo cumple exactamente con los requisitos que necesito.

Al final queda así :

Código MySQL:
Ver original
  1. SELECT L1.*
  2. FROM objectiu L1 INNER JOIN objectiu L2 ON L1.n_tarea=L2.n_tarea
  3. WHERE L1.id_objectiu  = 1 AND L2.id_objectiu = 2 order by n_tarea

gnzsoloyo Muchas gracias a ti también, lo del código en php lo he puesto por si no se entendía la pregunta, a veces pasa que tu mismo entiendes lo que escribes pero los demás no.
La lógica aplicada de las sentencias ... se me resiste jeje.

Saludos!
  #7 (permalink)  
Antiguo 28/07/2011, 09:26
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: Obtener registros con mismo valor en columna pero diferente en otra

Cita:
La lógica aplicada de las sentencias ... se me resiste jeje.
Paciencia... mis profesores de bases de datos decían que el razonamiento aplicado a la programación y el de bases de datos era muy diferente, y a mí me parecía una exageración. Pero la experiencia me ha mostrado que tenían mucha razón.
Son formas muy diferentes de ver las cosas y lleva tiempo acostumbrarse a saltar de una a otra.
__________________
¿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 28/07/2011, 10:40
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Obtener registros con mismo valor en columna pero diferente en otra

Hola de nuevo harryp:

Me alegro que la consulta del compañero gnzsoloyo te haya servido para resolver tu problema. Con respecto a mi propuesta, bueno, desde el momento que cambias el contexto de los datos originales pues es posible que no te ayude, soy informático, no divino jejeje... Sin embargo podrías utilizar la misma idea con una pequeña variación. Checa esto:

Código MySQL:
Ver original
  1. mysql> insert into lloc values (1,1,'A'),(1,2,'A'),
  2.     -> (1,3,'A'),(1,3,'B'),(2,1,'A'),(2,2,'A'),(3,1,'A');
  3. Query OK, 7 rows affected (0.04 sec)
  4. Records: 7  Duplicates: 0  Warnings: 0
  5.  
  6. mysql> select * from lloc;
  7. +---------+---------+---------+
  8. | id_lloc | n_tarea | campo_x |
  9. +---------+---------+---------+
  10. |       1 |       1 | A       |
  11. |       1 |       2 | A       |
  12. |       1 |       3 | A       |
  13. |       1 |       3 | B       |
  14. |       2 |       1 | A       |
  15. |       2 |       2 | A       |
  16. |       3 |       1 | A       |
  17. +---------+---------+---------+
  18. 7 rows in set (0.00 sec)
  19.  
  20. mysql> #consulta propuesta 1
  21. mysql> SELECT n_tarea FROM lloc
  22.     -> WHERE id_lloc IN (1,2) GROUP BY n_tarea HAVING COUNT(*) = 2;
  23. +---------+
  24. | n_tarea |
  25. +---------+
  26. |       1 |
  27. |       2 |
  28. |       3 |
  29. +---------+
  30. 3 rows in set (0.00 sec)
  31.  
  32. mysql> #consulta propuesta 2
  33. mysql> SELECT n_tarea FROM lloc
  34.     -> WHERE id_lloc IN (1,2) GROUP BY n_tarea
  35.     -> HAVING COUNT(DISTINCT n_tarea, id_lloc) = 2;
  36. +---------+
  37. | n_tarea |
  38. +---------+
  39. |       1 |
  40. |       2 |
  41. +---------+
  42. 2 rows in set (0.00 sec)

Si observas, efectivamente con la propuesta 1 aparece también la n_tarea 3, pero haciendo una modificación a la función COUNT agregando una condición DISTINCT arroja nuevamente los resultados deseados.

No estoy seguro si esta propuesta o la del compalero gnzsoloyo es más eficiente pues como dice acertadamente en su comentario la lógica es completamente diferente, sería cuestión de que probaras y nos comentaras, pero bueno, al menos te ofrece otro panorama de cómo puedes hacer ciertas cosas.

Saludos
Leo
  #9 (permalink)  
Antiguo 28/07/2011, 10:48
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: Obtener registros con mismo valor en columna pero diferente en otra

Mi comentario de la diferencia de lógica, Leo, no era sobre este problema, sino sobre la forma de analizar las cosas desde la orientación a los datos respecto del análisis que se hace desde la programación, que está orientada a procesos. No hablaba de un caso en especial.
Lo que cambia es la forma de ver los problemas.

Para el caso específico, el ejemplo que yo di apuntaba a cumplir con las condiciones con la menor cantidad de pasos y usos de funciones. Un INNER JOIN volviendo a llamar la misma tabla, pero buscando valores de segundo campos distintos para cada una, devuelve exactamente lo que se desea, sin más operaciones.
Ahora bien, mirándolo desde el uso que se le puede dar a la consulta, es muy limitado, porque sólo puede comparar sobre dos valores. Un tercer valor buscado podría requieria un nuevo llamado, pero de ser necesario así ya sería mejor recurrir a tu propuesta. En tanto no suceda... con esa alcanza.
__________________
¿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 28/07/2011, 10:57
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Obtener registros con mismo valor en columna pero diferente en otra

Hola gnzsoloyo:

Me queda claro que tu comentario no se refería a ningún caso en particular, lo cité justamente para mostrarle al compañero Harryp un ejemplo de lo que hablabas, pues con dos formas tan distintas de ver las cosas llegamos al mismo resultado.

Saludos
Leo.
  #11 (permalink)  
Antiguo 28/07/2011, 12:28
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 15 años, 10 meses
Puntos: 8
Respuesta: Obtener registros con mismo valor en columna pero diferente en otra

También parece ser valida, es mas, tenía en mente que el having me podría ayudar.

En cualquier caso esta visto que se puede plantear de diferente forma y llegar al mismo resultado.

Un saludo y gracias por todo

Etiquetas: exists
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 05:03.