Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: WHK en 24 Agosto 2013, 05:35 am



Título: Cómo Seleccionar un dato si existe en otra tabla?
Publicado por: WHK en 24 Agosto 2013, 05:35 am
Hola, he tenido un lapsus mental y no recuerdo como hacer esto:

Necesito seleccionar todos los datos de una tabla siempre y cuando el id esté relacionado por lo menos con un dato en otra tabla.

Por ejemplo, seleccionar todas las casas de la tabla casa siempre y cuando haya por lo menos una persona con ese id de casa asociado en la tabla personas. Los datos no están relacionados por base de datos, es solo una columna llamada idCasa.

Hacer dos consultas no es una solución, intenté utilizar iner join sin resultados o un select count entre parentesis pero no me resultó tampoco. Son demasiados datos en la db asi que se demora un poco en hacer el count() a la tabla personas por cada casa, en total se demora cerca de 1 minuto en cargar un selector en html.

Este sistema no lo hice yo pero debo realizarle unos cambios y necesito trabajar sobre la estructura que ya está hecha, alguna idea?


Título: Re: Cómo Seleccionar un dato si existe en otra tabla?
Publicado por: WHK en 24 Agosto 2013, 05:52 am
Bueno, hice algo que funciona pero no creo que sea lo mas recomendado:

Código:
SELECT idCasa, nombreCasa FROM Casas
INNER JOIN Personas ON Casas.idCasa = Personas.idCasa
group by Casas.nombreCasa

Alguien sabe otra manera de hacerlo mas eficiente?


Título: Re: Cómo Seleccionar un dato si existe en otra tabla?
Publicado por: Rudy21 en 26 Agosto 2013, 10:30 am
Puedes intentar así:

Select idCasa,nombrecasa from Casas where idCasa in (Select idCasa from Personas )


igual puedes intentar hacerlo con un DISTINCT

lo que haces ahi es decirle que te el idCasa de la tabla personas

y de la tabla Casas te devuelva el idCasa y el nombrecasa SOLO si esta presente en el select anterior =D

Saludos


Título: Re: Cómo Seleccionar un dato si existe en otra tabla?
Publicado por: 1mpuls0 en 26 Agosto 2013, 17:09 pm
Supongamos que tienes más o menos las siguientes estructuras básicas en tus tablas.

Código
  1. CREATE TABLE casas (
  2.  casa_pk INT(11) DEFAULT NULL,
  3.  persona_fk INT(11) DEFAULT NULL,
  4.  casa_direccion VARCHAR(30) COLLATE utf8_spanish_ci DEFAULT NULL
  5. ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
  6.  

Código
  1. CREATE TABLE personas (
  2.  persona_pk INT(11) DEFAULT NULL,
  3.  persona_nombre VARCHAR(30) COLLATE utf8_spanish_ci DEFAULT NULL
  4. ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
  5.  

Código
  1. INSERT  INTO casas(casa_pk,persona_fk,casa_direccion) VALUES (1,1,'avenida siempre viva'),(2,2,'Callejón Salsipuedes, en Barri'),(3,2,'Siempreviva, Col. La Hera. Izt'),(4,2,'Mar de la Crisis, Col. Ojo de ');
  2.  
  3. INSERT  INTO personas(persona_pk,persona_nombre) VALUES (1,'Homer J. S.'),(2,'1mpuls0');
  4.  

La consulta que deseas realizar tendría que ser así.

Código
  1. SELECT casas.casa_pk, casas.casa_direccion, personas.persona_pk, personas.persona_nombre
  2. FROM casas, personas
  3. WHERE (casas.persona_fk=personas.persona_pk)
  4.  

En lo personal uso subquerys pero podrías utilizar INNER JOIN.

Código
  1. SELECT casas.casa_pk, casas.casa_direccion, personas.persona_pk, personas.persona_nombre
  2. FROM casas INNER JOIN personas
  3. ON casas.persona_fk=personas.persona_pk
  4.  

Tu resultado sería así.

Código
  1. +---------+---------------------------------+------------+----------------+
  2. | casa_pk | casa_direccion                  | persona_pk | persona_nombre |
  3. +---------+---------------------------------+------------+----------------+
  4. |       1 | avenida siempre viva            |          1 | Homer J. S.    |
  5. |       2 | Callejon Salsipuedes, en Barri  |          2 | 1mpuls0        |
  6. |       3 | Siempreviva, Col. La Hera. Izt  |          2 | 1mpuls0        |
  7. |       4 | Mar de la Crisis, Col. Ojo de   |          2 | 1mpuls0        |
  8. +---------+---------------------------------+------------+----------------+
  9. 4 ROWS IN SET (0.00 sec)
  10.  
  11. mysql>
  12.  


Título: Re: Cómo Seleccionar un dato si existe en otra tabla?
Publicado por: 1mpuls0 en 26 Agosto 2013, 17:56 pm
Bueno, hice algo que funciona pero no creo que sea lo mas recomendado:

Código:
SELECT idCasa, nombreCasa FROM Casas
INNER JOIN Personas ON Casas.idCasa = Personas.idCasa
group by Casas.nombreCasa

Alguien sabe otra manera de hacerlo mas eficiente?

Está al revés, debes relacionar los campos id de la persona.
1 persona puede tener muchas casas.

Podrías mostrar la estructura de las tablas para ver si tiene algun problema.

Saludos.