Nueva pregunta

Pregunta:

Fecha: 27-07-2016 07:51:30 (En Español)

Consulta SQL - Unión de datos desde una misma tabla[Resuelta]

Ayuda con una consulta SQL por favor. Union desde una misma tabla.

Tengo una tabla llamada entidad, donde se registran datos de catálogos.
Mi problema es que quiero hacer un join entre datos de la misma tabla. Me explico.
Mi tabla ENTIDAD tiene estos campos:
id_entidad, nombre, descripcion, id_catalogo

En la tabla CATALOGO tengo registrado dos catalogos que guardar, por ejemplo, galletas. La diferencia es que (por la manera en que está hecha la estructura de la tabla) un catalogo muestra el nombre del empaque y el otro muestra el sabor, ambas comparten en común el tipó de galleta (campo descripcion en el catalogo 1 y campo nombre en el catalogo 2) desde ahí quiero hacerles la unión pero no sé cómo hacerlo desde la misma tabla.

Les pongo un ejemplo de lo que tengo y lo que quiero obtener:
CATALOGO id = 1
Lo registrado en ENTIDAD:
CAMPOS: id_entidad, nombre, descripción, id_catalogo
REGISTROS:
1, marias, galletas, 1
2, maravillas, galletin, 1
3, marinadas, galletota, 1
4, marianas, galletanas, 1
5, sabrosinas, galles, 1

CATALOGO id = 2
Lo registrado en ENTIDAD:
CAMPOS: id_entidad, nombre, descripción, id_catalogo
REGISTROS:
6, galletas, chocolate, 2
7, galletin, vainilla, 2
8, galletanas, fresa, 2


El resultado que quiero es el siguiente:
CAMPOS: nombre, nombreEmpaque, sabor
Registros:
galletas, marias, chocolate
galletin, maravillas, vainilla
galletanas, marianas, fresa

Nótese que no quiero que me muestra ni las "galles" ni las "galletota" porque no tienen un sabor registrado.

Muchas gracias, comunidad!

Etiquetas: MySQL - MySQL Desarrollo - Pregunta - Query - SQL - SQL Server Votos: 3 - Respuestas: 7 - Vistas: 17 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 27-07-2016 13:59:40 Hola Jesús, la forma de hacer un JOIN con la misma tabla es por medio de alias, usando la palabra reservada AS.

    Veamos esto con tu ejemplo:

    SELECT
        entidad2.nombre,
        entidad1.nombre AS 'nombreEmpaque',
        entidad2.descripcion AS 'sabor'
    FROM entidad AS entidad1
        INNER JOIN entidad AS entidad2
            ON(entidad1.descripcion = entidad2.nombre);
    


    Algunos comentarios:
    * Observa que en el SELECT utilizo alias para los nombres de los campos, aquí utilizo la palabra reservada AS seguida del alias entre comillas simples.
    * Por otro lado, observa que luego del nombre de la tabla utilizo la palabra AS seguida del alias sin comillas (OJO, no funciona con comillas).
    * Esta forma de almacenar los datos por más genial que parezca no es valida desde una perspectiva relacional, ya que no se cumple con las 3 formas normales.

    Prueba el código y luego nos cuentas.

    Saludos!
      Votos: 4 - Link respuesta
     
  • Fecha: 27-07-2016 14:20:35 Aquí les dejo lo que comenta Jesús en código MySQL, a fin de que puedan crear la estructura, insertar los datos y probar la consulta SQL.

    Creación de la tabla:
    CREATE TABLE entidad (
        id_entidad int unsigned NOT NULL,
        nombre varchar(50) NOT NULL,
        descripcion varchar(50) NOT NULL,
        id_catalogo int unsigned NOT NULL,
        PRIMARY KEY (id_entidad)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    


    Inserción de los datos:
    INSERT INTO entidad (`id_entidad`, `nombre`, `descripcion`, `id_catalogo`) VALUES
    (1, 'marias', 'galletas', 1),
    (2, 'maravillas', 'galletin', 1),
    (3, 'marinadas', 'galletota', 1),
    (4, 'marianas', 'galletanas', 1),
    (5, 'sabrosinas', 'galles', 1),
    (6, 'galletas', 'chocolate', 2),
    (7, 'galletin', 'vainilla', 2),
    (8, 'galletanas', 'fresa', 2);
    


    Consulta SQL que cumple con el requerimiento:
        SELECT
            entidad2.nombre,
            entidad1.nombre AS 'nombreEmpaque',
            entidad2.descripcion AS 'sabor'
        FROM entidad AS entidad1
            INNER JOIN entidad AS entidad2
                ON(entidad1.descripcion = entidad2.nombre);
    


    Saludos y buen código!
      Votos: 3 - Link respuesta
     
  • Fecha: 27-07-2016 16:53:47
    SELECT
        T1.descripcion, T1.nombre, T2.descripcion
    FROM
    ( SELECT
          nombre, descripcion
       FROM ENTIDAD
       WHERE
           id_catalogo = 1 ) T1
    INNER JOIN
    ( SELECT
          nombre, descripcion
      FROM ENTIDAD
      WHERE
          id_catalogo = 2) T2
    ON T1.descripcion = T2.nombre;
    


    Saludos!
      Votos: 2 - Link respuesta
     
  • Fecha: 27-07-2016 18:32:22 Hola Jesús, analizando la solución a la que arribaste, si bien la misma es valida no es tan performante como la que te propongo, y esto lo digo a fin de aprovechar el ejemplo para ir un poco mas allá, ya que claro está ambas soluciones son validas.

    Si analizamos el plan de ejecución de ambas consultas agregando la palabra reservada EXPLAIN delante del SELECT observaremos que para la consulta que propones se hacen 4 pasos:
    '1', 'PRIMARY', '<derived3>', 'ALL', NULL, NULL, NULL, NULL, '3', ''
    '1', 'PRIMARY', '<derived2>', 'ALL', NULL, NULL, NULL, NULL, '5', 'Using where; Using join buffer'
    '3', 'DERIVED', 'ENTIDAD', 'ALL', NULL, NULL, NULL, NULL, '8', 'Using where'
    '2', 'DERIVED', 'ENTIDAD', 'ALL', NULL, NULL, NULL, NULL, '8', 'Using where'


    Y para la consluta que yo propongo tan solo 2:
    '1', 'SIMPLE', 'entidad1', 'ALL', NULL, NULL, NULL, NULL, '8', ''
    '1', 'SIMPLE', 'entidad2', 'ALL', NULL, NULL, NULL, NULL, '8', 'Using where; Using join buffer'
    


    Claramente esto se debe a los dos subselect que estas incluyendo entre paréntesis.

    Saludos y buen código!
      Votos: 3 - Link respuesta
     
  • Fecha: 27-07-2016 19:36:07 Muy buena info, muchas gracias Fernando y Jesús, un placer leer PHPCentral, estoy aprendiendo mucho, saludos   Votos: 2 - Link respuesta
     
  • Fecha: 11-08-2016 05:37:52 Aunque ambos queries son válidos, yo sugeriría utilizaras el método que te sugiere Fernando. Cuando tu haces un query basada en el resultado de un segundo, al motor le toma más tiempo resolverlo. Si tu tabla tiene pocos registros, es irrelevante, pero conforme tu tabla vaya creciendo, la búsqueda se va a volver mas lenta.
    Es una "best practice" usar joins que unions o subqueries.
    Saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 11-08-2016 06:43:08 Gracias compañeros!

    Saludos!
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com