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.