Do a SELECT multiple tables and save in a worksheet

2

I'm trying to do a SELECT with multiple tables, where I have a product with your information, and I have another table structure to be able to add an extra field and their respective information.

What I tried to do was this:

SELECT p.codigo, p.compania_id, p.data_expiracao_registro, p.descricao,  p.descricao_breve, g.identificacao AS gtin, p.registro, p.altura, p.largura, p.profundidade, p.unidade_armazenamento, p.validade_meses, p.sku, ce.nome, cev.valor  INTO OUTFILE “C:/Users/coss/Desktop/produto_31-Julho.csv" FIELDS TERMINATED BY '$' LINES TERMINATED BY '\n' FROM produto AS p JOIN produto_campo_extra_valor AS pv ON (p.id = pv.produto_campos_extra_id) JOIN campo_extra AS ce ON (pv.campos_extra_idx = ce.id) JOIN campo_extra_valor AS cev ON (pv.campo_extra_valor_id = cev.id) JOIN codigogs1 AS g ON (p.gtin_id = g.id);

But does not return the expected shows only one tuple for the product with an extra field, and I have to assemble a spreadsheet with all the fields of the product.

This is my table structure:

product:

+-------------------------+--------------+------+-----+---------+--------------+
| Field                   | Type         | Null | Key | Default | Extra        |
+-------------------------+--------------+------+-----+---------+--------------+
| id                      | bigint(20)   | NO   | PRI | NULL    |auto_increment|
| version                 | bigint(20)   | NO   |     | NULL    |              |
| codigo varchar(255) | NO   | UNI | NULL    |                |
| compania_id             | bigint(20)   | NO   | MUL | NULL    |              |
| data_expiracao_registro | datetime     | YES  |     | NULL    |              |
| descricao               | varchar(255) | YES  |     | NULL    |              |
| descricao_breve         | varchar(255) | YES  |     | NULL    |              |
| gtin_id                 | bigint(20)   | NO   | MUL | NULL    |              |
| registro                | varchar(255) | YES  |     | NULL    |              |
| altura                  | float        | YES  |     | NULL    |              |
| largura                 | float        | YES  |     | NULL    |              |
| profundidade            | float        | YES  |     | NULL    |              |
| unidade_armazenamento   | int(11)      | YES  |     | NULL    |              |
| validade_meses          | int(11)      | YES  |     | NULL    |              |
| sku                     | varchar(255) | YES  |     | NULL    |              |
+-------------------------+--------------+------+-----+---------+--------------+

product_extra_extra_value:

    +-------------------------+------------+------+-----+---------+-------+
    | Field                   | Type       | Null | Key | Default | Extra |
    +-------------------------+------------+------+-----+---------+-------+
    | produto_campos_extra_id | bigint(20) | YES  |     | NULL    |       |
    | campo_extra_valor_id    | bigint(20) | YES  | MUL | NULL    |       |
    | campos_extra_idx        | int(11)    | YES  |     | NULL    |       |
    +-------------------------+------------+------+-----+---------+-------+

field_extra:

+-----------+--------------+------+-----+---------+----------------+
    | Field     | Type         | Null | Key | Default | Extra          |
    +-----------+--------------+------+-----+---------+----------------+
    | id        | bigint(20)   | NO   | PRI | NULL    | auto_increment |
    | version   | bigint(20)   | NO   |     | NULL    |                |
    | descricao | varchar(255) | YES  |     | NULL    |                |
    | dominio   | varchar(255) | NO   | MUL | NULL    |                |
    | nome      | varchar(255) | NO   |     | NULL    |                |
    +-----------+--------------+------+-----+---------+----------------+

field_extra_value:

+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id  bigint(20)   | NO   | PRI | NULL    | auto_increment |
| version bigint(20)   | NO   |     | NULL    |                |
| campo_extra_id bigint(20)   | NO   | MUL | NULL    |                |
| valor varchar(255) | NO   |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+

My problem is how to make the value of the extra field appear for each product, and in the select column it is the name of the extra field.

Example: Product:

                     id: 1
                version: 34
                 codigo: 9000200502
            compania_id: 1
data_expiracao_registro: NULL
              descricao: Cerasorb M 500-1000 ╡m 2X0,5cc
        descricao_breve: Cerasorb M 500-1000 ╡m 2X0,5cc
                gtin_id: 1
               registro: 10356500033
                 altura: 135
                largura: 116
           profundidade: 32
  unidade_armazenamento: 96
         validade_meses: 48
                    sku:

product_extra_extra_value:

*************************** 1. row ***************************
produto_campos_extra_id: 1
   campo_extra_valor_id: 2056
       campos_extra_idx: 1
*************************** 2. row ***************************
produto_campos_extra_id: 1
   campo_extra_valor_id: 8369
       campos_extra_idx: 2

field_extra:

*************************** 1. row ***************************
       id: 1
  version: 0
descricao: Famφlia
  dominio: PRODUTO
     nome: familia
*************************** 2. row ***************************
       id: 2
  version: 0
descricao: Subfamilia
  dominio: PRODUTO
     nome: subfamilia

field_extra_value:

*************************** 1. row **********
            id: 2056
       version: 0
campo_extra_id: 2
         valor: BIO
*************************** 2. row **********
            id: 8369
       version: 0
campo_extra_id: 3
         valor:

In this case I want to generate a spreadsheet with the values of the product and their respective extra fields, can anyone help me with this select?

Expected result

*************************** 1. row **********
             codigo: 9000200502
    data_expiracao_registro: NULL
                  descricao: Cerasorb M 500-1000 ╡m 2X0,5cc
            descricao_breve: Cerasorb M 500-1000 ╡m 2X0,5cc
                    gtin: 111111111
                   registro: 10356500033
                     altura: 135
                    largura: 116
               profundidade: 32
      unidade_armazenamento: 96
             validade_meses: 48
                        sku:
                     nome: familia
                       valor: BIO
*************************** 2. row **********
       codigo: 9000200502
    data_expiracao_registro: NULL
                  descricao: Cerasorb M 500-1000 ╡m 2X0,5cc
            descricao_breve: Cerasorb M 500-1000 ╡m 2X0,5cc
                    gtin: 111111111
                   registro: 10356500033
                     altura: 135
                    largura: 116
               profundidade: 32
      unidade_armazenamento: 96
             validade_meses: 48
                        sku:
                     nome: subfamilia
                       valor:

I know I'm doing something wrong because only the first line appears, and in this example it's two because I have two extra fields related to this product, but the real thing is that I have a varied size of extra fields.

EDIT

I tried to do a procedure to mount another table in my output but this one giving errors:

CREATE TABLE saida(
  tupla varchar(500)
);

DELIMITER |

DROP PROCEDURE IF EXISTS exportar_produtos |
CREATE PROCEDURE exportar_produtos()
BEGIN
    DROP TABLE IF EXISTS produtos_exportados;
    CREATE TEMPORARY TABLE produtos_exportados (
      id                        bigint(20),
      codigo                    varchar(255),
      data_expiracao_registro   datetime,
      descricao                 varchar(255),
      descricao_breve           varchar(255),
      gtin                      varchar(255),
      registro                  varchar(255),
      altura                    float,
      largura                   float,
      profundidade              float,
      unidade_armazenamento     int(11),
      validade_meses            int(11),
      sku                       varchar(255)
    );

    INSERT INTO produtos_exportados (id, codigo, data_expiracao_registro, descricao, descricao_breve, gtin, registro, altura, largura, profundidade,unidade_armazenamento, validade_meses, sku)
      SELECT p.id, p.codigo, p.compania_id, p.data_expiracao_registro, p.descricao,  p.descricao_breve, g.identificacao, p.registro, p.altura, p.largura, p.profundidade, p.unidade_armazenamento, p.validade_meses, p.sku
        FROM produto AS p JOIN codigogs1 AS g ON (p.gtin_id = g.id);

      CALL gerar_saida();
END |

DROP PROCEDURE IF EXISTS gerar_saida |
CREATE PROCEDURE gerar_saida()
BEGIN
  DECLARE id_produto bigint(20);
  DECLARE t_campos_extras VARCHAR(500);
  DECLARE v_finished INTEGER DEFAULT 0;

  DEClARE lista CURSOR FOR
    SELECT id FROM produtos_exportados;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

  /*DELETE FROM debug;

  DECLARE CONTINUE HANDLER FOR 1172
  BEGIN
    INSERT INTO debug(msg) VALUES (CONCAT("Problema no produto: ", id_produto, ". "));
  END;*/

  OPEN lista;
  interno_get: LOOP
    FETCH lista INTO id_produto;
    IF v_finished = 1 THEN
      LEAVE interno_get;
    END IF;

    CALL buscar_campo_extra_produto(id_produto, t_campos_extras);

    INSERT INTO saida(tupla) VALUES (
      SELECT CONCAT(pe.codigo, "$", pe.compania_id, "$", pe.data_expiracao_registro, "$", pe.descricao, "$",  pe.descricao_breve, "$", pe.gtin, "$", pe.registro, "$", pe.altura, "$", pe.largura,
        "$", pe.profundidade, "$", pe.unidade_armazenamento, "$", pe.validade_meses, "$", pe.sku, "$", t_campos_extras) FROM produtos_exportados AS pe WHERE pe.id = id_produto;

  END LOOP interno_get;
  CLOSE lista;
END |

DROP PROCEDURE IF EXISTS buscar_campo_extra_produto |
CREATE PROCEDURE buscar_campo_extra_produto(IN id_produto INT, OUT t_campos_extras VARCHAR)
BEGIN
  DECLARE t_nome varchar(255);
  DECLARE t_valor varchar(255);
  DECLARE v_finished INTEGER DEFAULT 0;

  DEClARE campos_extras CURSOR FOR
    SELECT ce.nome, cev.valor
      FROM produto_campo_extra_valor AS pv
        JOIN campo_extra AS ce ON (pv.campos_extra_idx = ce.id)
        JOIN campo_extra_valor AS cev ON (pv.campo_extra_valor_id = cev.id)
      WHERE pv.produto_campos_extra_id = id_produto;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

  DELETE FROM debug;

  DECLARE CONTINUE HANDLER FOR 1172
  BEGIN
    INSERT INTO debug(msg) VALUES (CONCAT("Problema no produto: ", id_produto, ". "));
  END;

  SET t_campos_extras = "";
  OPEN campos_extras;
  interno_get: LOOP
    FETCH campos_extras INTO t_nome, t_valor;
    IF v_finished = 1 THEN
      LEAVE interno_get;
    END IF;

    SET t_campos_extras = CONCAT(t_campos_extras, "$", t_nome, "$", t_valor);

  END LOOP interno_get;
  CLOSE campos_extras;
END |

DELIMITER;

The following is the error:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near

This error appears in colon in CONCAT(pe.codigo, "$", pe.com... and in

)
    BEGIN
      DECLARE t_nome varchar(255);

I do not know if this procedure will be helping me mount the result I hope.

    
asked by anonymous 30.07.2018 / 20:13

1 answer

-1

You can do a trigger, you have a question corresponding to that in the following link:

p>     
01.08.2018 / 14:46