2

Este es mi dilema, tengo 2 tablas estructuradas así:

 ************    ********************
 * Producto *    * Tipo de Producto *
 ************    ********************
 * ID       *    * ID               *
 * Nombre   *    * Nombre           *
 * Tipo     *    ********************
 ************

En Productos.Tipo el valor es un ID en la tabla Tipo de producto, una relación uno a muchos.

Solo quiero saber cómo hacer que al llamar datos de productos, al llamar tipo, en vez de retornarme un ID de Tipo de productos, me retorne el valor Nombre que hay en Tipo de producto según el ID en Producto.

Le pregunté a una profesora pero lo que me dio fue este query:

SELECT Producto.ID
    ,Producto.Nombre
    ,Tipo_de_Producto.Nombre
FROM Producto
    ,Tipo_de_Producto
WHERE Producto.Tipo = Tipo_de_Producto.ID
    AND Producto.ID = 'loquesea'
Phi
  • 9,913
  • 5
  • 25
  • 47
Anonimo
  • 21
  • 1
  • 2

2 Answers2

2

Sería cuestión de hacer un LEFT JOIN u otro tipo de JOIN usando la columna tipo_id, que es clave primaria de la tabla productos_tipo y es clave foránea en la tabla productos.

Con el LEFT JOIN, si hay un producto que no tiene valor en la columna tipo_id, se mostrará de todos modos el nombre del producto y en la columna de la derecha habrá un valor NULL.

Eso ya dependerá de lo que quieras hacer. Los JOIN estás explicados aquí: ¿Cuál es la diferencia entre un inner y un outer join?

Se puede también hacer, si se necesita, filtros del tipo WHERE por ejemplo, o agrupaciones, usando cualquiera de las columnas de las dos tablas.

Para más claridad me gusta usar alias de tabla de este modo:

productos p... productos_tipos pt y luego cuando hay que referirse a cualquier columna de ellas sólo se usa p.columna o pt.columna.

Este es un ejemplo completo. Fíjate en Query 1 y Query 2 más abajo.

SQL Fiddle

MySQL 5.6 Schema Setup:

CREATE TABLE productos
    (`producto_id` int, `producto_nom` varchar(30), `tipo_id` int)
;

INSERT INTO productos
    (`producto_id`, `producto_nom`, `tipo_id`)
VALUES
    (1, 'Arroz', 1),
    (2, 'Pantalón', 2),
    (3, 'Jabón', 3),
    (4, 'Pescado', 1);

CREATE TABLE productos_tipos
    (`tipo_id` int, `tipo_nom` varchar(30))
;

INSERT INTO productos_tipos
    (`tipo_id`, `tipo_nom`)
VALUES
    (1, 'Alimentos'),
    (2, 'Ropa'),
    (3, 'Limpieza');

Query 1:

-- Quiero todo


SELECT
  p.producto_nom, pt.tipo_nom
FROM
  productos p
LEFT JOIN productos_tipos pt
  ON p.tipo_id=pt.tipo_id

Results:

| producto_nom |  tipo_nom |
|--------------|-----------|
|        Arroz | Alimentos |
|      Pescado | Alimentos |
|     Pantalón |      Ropa |
|        Jabón |  Limpieza |

Query 2:

 -- Quiero sólo arroz 

SELECT
  p.producto_nom, pt.tipo_nom
FROM
  productos p
LEFT JOIN productos_tipos pt
  ON p.tipo_id=pt.tipo_id
  WHERE p.producto_id=1

Results:

| producto_nom |  tipo_nom |
|--------------|-----------|
|        Arroz | Alimentos |
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
0

Es importante evitar el uso de un join implícito, ya que es una funcionalidad deprecada, lo ideal es hacer el uso de un join explícito. Si deseas más información acerca de las diferencias y su uso revisa esta excelente respuesta que detalla todo para su entendiemiento:

Ahora, para transormar tu consulta a un join explícito sería con:

SELECT Producto.ID
    ,P.Nombre
    ,TP.Nombre
FROM Producto P
    INNER JOIN Tipo_de_Producto TP 
        ON P.Tipo = TP.ID
WHERE P.ID = 'loquesea'

Esta consulta crea la relación que existe entre ambas tablas, entonces, al enviar como condición el ID del producto a su vez estás seleccionando de igual forma los datos del tipo de producto con TP.Nombre.

Phi
  • 9,913
  • 5
  • 25
  • 47