MySQL - Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

   
Vista:

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por Luvi (3 intervenciones) el 19/04/2017 10:45:29
Hola!
Ojalá alguien me pueda ayudar... tengo esta duda:
Tengo dos tablas: Clientes y Telefonos
Quiero obtener el listado completo de Clientes con un solo telefono (hay clientes que tienen 3 telefonos, otros solo 1 otros 2 y así.... pero yo necesito mostrar solo 1 teléfono, es decir solo un registro de la segunda tabla)

he intentado varias cosas sin que funcionen.... Agradezco su valiosa ayuda!
Select c.nombre, t.telefono
from clientes c __?__ join telefonos t on c.clavecliente = t.clavecliente

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por leonardo_josue (363 intervenciones) el 19/04/2017 16:25:37
Hola Luvi:

Hay muchas formas de resolver tu problema, dependiendo de lo que necesites, si por ejemplo NO TE INTERESA CUÁL DE LOS NÚMEROS DE TELÉFONO SE MUESTRE, SIEMPRE QUE SE MUESTRE SÓLO UNO DE ELLOS, las más simples serían utilizar subconsultas y agrupación. Para el ejemplo que voy a poner voy a suponer que tienes algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> SELECT * FROM clientes;
+------------+----------------+
| id_cliente | nombre         |
+------------+----------------+
|          1 | CLIENTE UNO    |
|          2 | CLIENTE DOS    |
|          3 | CLIENTE TRES   |
|          4 | CLIENTE CUATRO |
+------------+----------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM telefonos;
+-------------+------------+----------------+
| id_telefono | id_cliente | telefono       |
+-------------+------------+----------------+
|           1 |          1 | (111)-111-1111 |
|           2 |          1 | (111)-111-1112 |
|           3 |          1 | (111)-111-1113 |
|           4 |          2 | (222)-222-2221 |
|           5 |          2 | (222)-222-2222 |
|           6 |          3 | (333)-333-3333 |
+-------------+------------+----------------+
6 rows in set (0.00 sec)

Al hacer un JOIN convenciona, entonces aquellos clientes que tengan más de un teléfono se mostrarán "repetidos":

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT
    ->   clientes.id_cliente,
    ->   clientes.nombre,
    ->   telefonos.telefono
    -> FROM
    ->   clientes
    -> LEFT JOIN
    ->   telefonos ON clientes.id_cliente = telefonos.id_cliente;
+------------+----------------+----------------+
| id_cliente | nombre         | telefono       |
+------------+----------------+----------------+
|          1 | CLIENTE UNO    | (111)-111-1111 |
|          1 | CLIENTE UNO    | (111)-111-1112 |
|          1 | CLIENTE UNO    | (111)-111-1113 |
|          2 | CLIENTE DOS    | (222)-222-2221 |
|          2 | CLIENTE DOS    | (222)-222-2222 |
|          3 | CLIENTE TRES   | (333)-333-3333 |
|          4 | CLIENTE CUATRO | NULL           |
+------------+----------------+----------------+
7 rows in set (0.00 sec)

Entonces, para mostrar sólo un teléfono utilizando SUBCONSULTAS, lo podrías hacer así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT
    ->   clientes.nombre,
    ->   ( SELECT telefonos.telefono
    ->     FROM telefonos
    ->     WHERE  clientes.id_cliente = telefonos.id_cliente
    ->     LIMIT 1) telefono
    -> FROM clientes;
+----------------+----------------+
| nombre         | telefono       |
+----------------+----------------+
| CLIENTE UNO    | (111)-111-1111 |
| CLIENTE DOS    | (222)-222-2221 |
| CLIENTE TRES   | (333)-333-3333 |
| CLIENTE CUATRO | NULL           |
+----------------+----------------+
4 rows in set (0.01 sec)

Sin embargo, este tipo de consultas puede resultar muy tardada. Otra forma sería AGRUPANDO, utilizando de manera un tanto "tramposa" alguna función de agrupación como MIN o MAX:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT
    ->   clientes.id_cliente,
    ->   clientes.nombre,
    ->   MAX(telefonos.telefono) telefono
    -> FROM
    ->   clientes
    -> LEFT JOIN
    ->   telefonos ON clientes.id_cliente = telefonos.id_cliente
    -> GROUP BY
    ->   clientes.id_cliente, clientes.nombre;
+------------+----------------+----------------+
| id_cliente | nombre         | telefono       |
+------------+----------------+----------------+
|          1 | CLIENTE UNO    | (111)-111-1113 |
|          2 | CLIENTE DOS    | (222)-222-2222 |
|          3 | CLIENTE TRES   | (333)-333-3333 |
|          4 | CLIENTE CUATRO | NULL           |
+------------+----------------+----------------+
4 rows in set (0.00 sec)

Observa que en el caso de los clientes UNO y DOS, el teléfono que se muestra en cada consulta es distinto... si ten interesa mostrar algún número de teléfono en particular tendrías que buscar otra alternativa.

Hay otras formas además de estás, dependiendo de cómo tienes organizados tus datos. Si puedes, postea la estructura de tus tablas y pon algunos datos de ejemplo y con gusto te ayudamos a buscar otra alternativa mejor.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por Luvi (3 intervenciones) el 19/04/2017 17:02:10
Hola Leo,
Muchisimas gracias por tu valiosa ayuda y por tu tiempo .... ya se solucionó y el MAX me sirvió mucho también... !
Saludos, Luvi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alejandro

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por Alejandro (5 intervenciones) el 19/04/2017 16:37:13
1
SELECT DISTINCT(C.nombre), T.telefono FROM clientes AS C INNER JOIN telefonos AS T on C.claveCliente = T.claveCliente

1
SELECT nombre, (SELECT telefono AS T FROM telefonos WHERE T.claveCliente=C.claveCliente LIMIT 1) AS telefono FROM Clientes AS C
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por Luvi (3 intervenciones) el 19/04/2017 17:03:26
Hola Alejandro, Muchas gracias por tu ayuda!!!
Saludos,
Luvi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad