Merge results from a sql in just one row

3

I have the following database:

CREATE DATABASE  IF NOT EXISTS 'materiais'; 
USE 'materiais';
 --
-- Table structure for table 'categoria'
--

 CREATE TABLE 'categoria' (
  'id_categoria' int(11) NOT NULL,
  'descricao_categoria' varchar(100) NOT NULL,
  'sin_ativo' char(1) NOT NULL DEFAULT 'S',
  PRIMARY KEY ('id_categoria')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table 'categoria'
--

 INSERT INTO 'categoria' VALUES (1,'travessas','S'),(2,'Capa Cromada','S'),(3,'Coifas Vedante','S'),(4,'Chassis Metálicos','S'),(5,'Quadros Hidráulicos','S'),(6,'Tampa de Inspeção','S'),(7,'Abraçadeira Sextavada Tipo M','S'),(8,'Ponto de Filtro','S'),(9,'TE Ducha higiênica','S'),(10,'Carenagens Plásticas','S');

--
-- Table structure for table 'metricas'
--

 CREATE TABLE 'metricas' (
  'id_metricas' int(11) NOT NULL,
  'descricao' varchar(45) NOT NULL,
  PRIMARY KEY ('id_metricas')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table 'metricas'
--

 INSERT INTO 'metricas' VALUES (1,'A Máx (mm)'),(2,'A Min (mm)'),(3,'B'),(4,'C'),(5,'B (mm)');

--
-- Table structure for table 'imagem'
--

 CREATE TABLE 'imagem' (
  'id_imagem' int(11) NOT NULL,
  'caminho' varchar(100) NOT NULL,
  'sin_ativo' varchar(45) DEFAULT 'S',
  'produto_id_produto' int(11) NOT NULL,
  PRIMARY KEY ('id_imagem'),
  KEY 'fk_imagem_produto1' ('produto_id_produto'),
  CONSTRAINT 'fk_imagem_produto1' FOREIGN KEY ('produto_id_produto') REFERENCES 'produto' ('id_produto') ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table 'imagem'
--

 --
-- Table structure for table 'especificacao'
--

DROP TABLE IF EXISTS 'especificacao';
 CREATE TABLE 'especificacao' (
  'id_codigo' varchar(15) NOT NULL,
  'id_metricas' int(11) NOT NULL,
  'valor' varchar(45) DEFAULT NULL,
  PRIMARY KEY ('id_codigo','id_metricas'),
  KEY 'fk_codigo_has_metricas_metricas1' ('id_metricas'),
  KEY 'fk_codigo_has_metricas_codigo1' ('id_codigo'),
  CONSTRAINT 'fk_codigo_has_metricas_codigo1' FOREIGN KEY ('id_codigo') REFERENCES 'codigo' ('id_codigo') ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT 'fk_codigo_has_metricas_metricas1' FOREIGN KEY ('id_metricas') REFERENCES 'metricas' ('id_metricas') ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table 'especificacao'
--

 INSERT INTO 'especificacao' VALUES ('CAN16',3,'57'),('CAN16',4,'63'),('CC00000016',1,'457'),('CC00000016',2,'317'),('CC00000016',5,'53'),('ESP400',1,'394'),('ESP400',2,'254');

--
-- Table structure for table 'codigo'
--

 CREATE TABLE 'codigo' (
  'id_codigo' varchar(15) NOT NULL,
  'id_produto' int(11) NOT NULL,
  'sin_ativo' char(1) NOT NULL DEFAULT 'S',
  'descricao' varchar(45) DEFAULT NULL,
  PRIMARY KEY ('id_codigo'),
  KEY 'fk_codigo_produto1' ('id_produto'),
  CONSTRAINT 'fk_codigo_produto1' FOREIGN KEY ('id_produto') REFERENCES 'produto' ('id_produto') ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 --
-- Dumping data for table 'codigo'
--

 INSERT INTO 'codigo' VALUES ('CAN16',7,'S',NULL),('CC00000016',8,'S',NULL),('ESP400',7,'S',NULL),('TMMC390100',2,'S',NULL),('TMRP1239070',1,'S',NULL),('TMRP3439070',1,'S',NULL);

--
-- Table structure for table 'produto'
--

 CREATE TABLE 'produto' (
  'id_produto' int(11) NOT NULL,
  'descricao' varchar(75) NOT NULL,
  'sin_ativo' char(1) NOT NULL DEFAULT 'S',
  'id_categoria' int(11) NOT NULL,
  PRIMARY KEY ('id_produto'),
  KEY 'fk_produtos_categoria' ('id_categoria'),
  CONSTRAINT 'fk_produtos_categoria' FOREIGN KEY ('id_categoria') REFERENCES 'categoria' ('id_categoria') ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table 'produto'
--

 INSERT INTO 'produto' VALUES (1,'Travessa para Registro de Pressão','S',1),(2,'Travessa para Monocomando','S',1),(3,'Travessa Tubular Para Cotovelo','S',1),(4,'Travessa para Distribuidor','S',1),(5,'Travessa para Aquecedor e tanque','S',1),(6,'Travessa para registro de gaveta','S',1),(7,'Conjunto Capa Cromada','S',2),(8,'CONJUNTO CAPA CROMADA CANOPLA EM LATÃO CROMADO','S',2),(9,'CONJUNTO CAPA CROMADA CANOPLA EM ABS','S',2),(10,'COIFA SIMPLES','S',3),(11,'COIFA SILICONE','S',3),(12,'COIFA TRIPLA','S',3),(13,'COIFA DUPLA','S',3),(14,'COIFA QUADRUPLA','S',3),(15,'CARENAGEM TANQUE','S',10),(16,'CHASSI TANQUE','S',4),(17,'QUADRO CHUVEIRO DE SOBREPOR - 2 TRAVESSAS','S',5),(18,'TAMPA DE INSPEÇÃO VENTILADA','S',6),(19,'ABRAÇADEIRA SEXTAVADA TIPO M','S',7),(20,'PONTO DE FILTRO','S',8),(21,'TE DUCHA HIGIÊNICA','S',9);

When performing sql:

select p.id_produto, p.descricao, c.id_codigo, m.descricao,e.valor
from produto as p inner join codigo as c ON p.id_produto =
c.id_produto inner join especificacao as e ON e.id_codigo =
c.id_codigo inner join metricas as m ON e.id_metricas  = m.id_metricas
where c.id_produto = 7

The result for each product is given in two lines with the example:

id_produto  descricao             id_codigo     descricao   valor
7          Conjunto Capa Cromada    CAN16           B       57
7          Conjunto Capa Cromada    CAN16           C       63
7          Conjunto Capa Cromada    ESP400      A Máx (mm)  394
7          Conjunto Capa Cromada    ESP400      A Min (mm)  254

I need the returned value to appear separated by product in just one line, for example:

id_produto descricao id_codigo descricao valor descricao valor

7      Conjunto Capa Cromada CAN16       B    57    C              63

How to solve?

    
asked by anonymous 22.10.2014 / 00:10

1 answer

1

So I guess to solve your problem you can use an aggregate function like GROUP_CONCAT of mysql.

select 
    p.id_produto
  , p.descricao
  , c.id_codigo
  , group_concat(m.descricao order by p.id_produto, ', ') as descricao
  , group_concat(e.valor  order by p.id_produto, ', ') as valor
from produto as p 
inner join codigo as c ON p.id_produto = c.id_produto 
inner join especificacao as e ON e.id_codigo = c.id_codigo 
inner join metricas as m ON e.id_metricas  = m.id_metricas
where c.id_produto = 7
group by p.id_produto
  , p.descricao
  , c.id_codigo
;

obs: I'm not sure if the syntax is correct, I found this information here , based on the Oracle 11g list.

    
22.10.2014 / 13:25