Cómo Seleccionar un dato si existe en otra tabla?

Iniciado por WHK, 24 Agosto 2013, 05:35 AM

0 Miembros y 1 Visitante están viendo este tema.

WHK

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?

WHK

Bueno, hice algo que funciona pero no creo que sea lo mas recomendado:

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?

Rudy21

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


1mpuls0

#3
Supongamos que tienes más o menos las siguientes estructuras básicas en tus tablas.

Código (sql) [Seleccionar]

CREATE TABLE casas (
 casa_pk INT(11) DEFAULT NULL,
 persona_fk INT(11) DEFAULT NULL,
 casa_direccion VARCHAR(30) COLLATE utf8_spanish_ci DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci


Código (sql) [Seleccionar]

CREATE TABLE personas (
 persona_pk INT(11) DEFAULT NULL,
 persona_nombre VARCHAR(30) COLLATE utf8_spanish_ci DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci


Código (sql) [Seleccionar]

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 ');

INSERT  INTO personas(persona_pk,persona_nombre) VALUES (1,'Homer J. S.'),(2,'1mpuls0');


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

Código (sql) [Seleccionar]

SELECT casas.casa_pk, casas.casa_direccion, personas.persona_pk, personas.persona_nombre
FROM casas, personas
WHERE (casas.persona_fk=personas.persona_pk)


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

Código (sql) [Seleccionar]

SELECT casas.casa_pk, casas.casa_direccion, personas.persona_pk, personas.persona_nombre
FROM casas INNER JOIN personas
ON casas.persona_fk=personas.persona_pk


Tu resultado sería así.

Código (sql) [Seleccionar]

+---------+---------------------------------+------------+----------------+
| casa_pk | casa_direccion                  | persona_pk | persona_nombre |
+---------+---------------------------------+------------+----------------+
|       1 | avenida siempre viva            |          1 | Homer J. S.    |
|       2 | Callejon Salsipuedes, en Barri  |          2 | 1mpuls0        |
|       3 | Siempreviva, Col. La Hera. Izt  |          2 | 1mpuls0        |
|       4 | Mar de la Crisis, Col. Ojo de   |          2 | 1mpuls0        |
+---------+---------------------------------+------------+----------------+
4 rows in set (0.00 sec)

mysql>
abc

1mpuls0

#4
Cita de: WHK en 24 Agosto 2013, 05:52 AM
Bueno, hice algo que funciona pero no creo que sea lo mas recomendado:

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.
abc