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

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 8 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por leonardo_josue (414 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
sin imagen de perfil
Val: 6
Ha aumentado su posición en 8 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

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
Val: 8
Ha aumentado su posición en 9 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Relacionar dos tablas obteniendo solo 1 registro de la segunda tabla

Publicado por Alejandro (21 intervenciones) el 19/04/2017 16:37:13
  • Alejandro se encuentra ahora conectado en el
  • chat de PHP
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
sin imagen de perfil
Val: 6
Ha aumentado su posición en 8 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

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