Error adding COUNT in CONCAT

Asked

Viewed 113 times

1

When I try to add the COUNT it returns error, but when I shoot, the script works normal. Follow the error:

Invalid use of group function

Script:

SELECT DISTINCT 
        TB_PRODUTOS.ID_PRODUTO,
        CONVERT(
            GROUP_CONCAT(
                DISTINCT CONCAT(
                    TB_PRODUTOS.NOME_PRODUTO,
                    "(", COUNT(TB_PRODUTOS.ID_PRODUTO), ")"
                ) 
                SEPARATOR ', '
            ) 
            USING 'utf8'
        ) AS NOME_PRODUTO,      
        TB_ITEM_PEDIDO_PRODUTO.ID_PEDIDO,
        TB_ITEM_PEDIDO_PRODUTO.ID_PRODUTO
    FROM TB_ITEM_PEDIDO_PRODUTO     
    INNER JOIN TB_PEDIDO ON TB_PEDIDO.ID_PEDIDO = TB_ITEM_PEDIDO_PRODUTO.ID_PEDIDO  
    INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = TB_ITEM_PEDIDO_PRODUTO.ID_PRODUTO
    WHERE TB_PEDIDO.ID_PESSOA = 1
    GROUP BY TB_PEDIDO.ID_PEDIDO

I want that result returned:

Produto
--------------------------------
produto(2), testando(1), teste(4)

I followed this website:

http://www.percona.com/blog/2013/10/22/the-power-of-mysqls-group_concat/

Database:

TB_PEDIO:

TB_PEDIDO

TB_ITEM_PEDIDO_PRODUTO:

TB_ITEM_PEDIDO_PRODUTO

TB_ITEM_PEDIDO_PRODUTO_INGREDIENTE:

TB_ITEM_PEDIDO_PRODUTO_INGREDIENTE

TB_PRODUTO:

TB_PRODUTO

TB_PRODUTOS_INGREDITES:

TB_PRODUTOS_INGREDIENTES

TB_INGREDITES:

TB_INGREDIENTES

  • I think an order by GROUP_CONCAT( DISTINCT CONCAT( TB_PRODUTOS.NOME_PRODUTO, "(", COUNT(TB_PRODUTOS.ID_PRODUTO), ")" ) ORDER BY TB_PRODUTOS.ID_PRODUTO SEPARATOR ', &#Xa'; )

  • @Pedrorangel, it’s not the order by:/

  • Voce could show me your test base with the respective tables?

  • @Pedrorangel, Updated!

2 answers

1

Fields in aggregate functions such as max,min,avg or count shall be excluded from the clause GROUP BY.

Try the following:

SELECT DISTINCT 
        TB_PRODUTOS.ID_PRODUTO,
        CONVERT(
            GROUP_CONCAT(
                DISTINCT CONCAT(
                    TB_PRODUTOS.NOME_PRODUTO,
                    "(", COUNT(TB_PRODUTOS.ID_PRODUTO), ")"
                ) 
                SEPARATOR ', '
            ) 
            USING 'utf8'
        ) AS NOME_PRODUTO,      
        TB_ITEM_PEDIDO_PRODUTO.ID_PEDIDO,
        TB_ITEM_PEDIDO_PRODUTO.ID_PRODUTO
    FROM TB_ITEM_PEDIDO_PRODUTO     
    INNER JOIN TB_PEDIDO ON TB_PEDIDO.ID_PEDIDO = TB_ITEM_PEDIDO_PRODUTO.ID_PEDIDO  
    INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = TB_ITEM_PEDIDO_PRODUTO.ID_PRODUTO
    WHERE TB_PEDIDO.ID_PESSOA = 1
  • Failed, resulted in the following mistake: Invalid use of group function

  • @The problem is GROUP_CONCAT - http://stackoverflow.com/questions/17463171/using-count-in-group-concat . Soon I’ll make the adaptation

1


The Best Solution is to process this in the Application, but if there is a reason to resolve it in SELECT, I suggest you use a sub-select of the amount of items of each ID_PRODUTO.

See if it works with the solution below:

SELECT DISTINCT 
    TB_PRODUTOS.ID_PRODUTO,
    CONVERT(
        GROUP_CONCAT(
            DISTINCT CONCAT(
                TB_PRODUTOS.NOME_PRODUTO,
                "(", 
                (SELECT COUNT(1) FROM TB_PRODUTOS AS SUB_PRODUTOS WHERE SUB_PRODUTOS.ID_PRODUTO = TB_PRODUTOS.ID_PRODUTO),
                ")"
            ) 
            SEPARATOR ', '
        ) 
        USING 'utf8'
    ) AS NOME_PRODUTO,      
    TB_ITEM_PEDIDO_PRODUTO.ID_PEDIDO,
    TB_ITEM_PEDIDO_PRODUTO.ID_PRODUTO
FROM TB_ITEM_PEDIDO_PRODUTO     
INNER JOIN TB_PEDIDO ON TB_PEDIDO.ID_PEDIDO = TB_ITEM_PEDIDO_PRODUTO.ID_PEDIDO  
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = TB_ITEM_PEDIDO_PRODUTO.ID_PRODUTO
WHERE TB_PEDIDO.ID_PESSOA = 1
GROUP BY TB_PEDIDO.ID_PEDIDO
  • Your query resulted in the following error: 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 'FROM SUB_PRODUTOS.ID_PRODUTO = TB_PRODUTOS.ID_PRODUTO),
 ")"
 ' at line 8

  • I duplicated the from unintentionally,

  • It worked Now? I edited!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.