Error "Unknown column" in Mysql query

Asked

Viewed 769 times

0

Code:

(SELECT
   TB_INGREDIENTES.ID_INGREDIENTE,
   TB_INGREDIENTES.INGREDIENTE,
   TB_INGREDIENTES.QUANTIDADE_INGREDIENTE_TOTAL,
   TB_INGREDIENTES.FLAG,
   TB_INGREDIENTES.ACRESCIMO,

   TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES,
   TB_PRODUTOS_INGREDIENTES.QUANTIDADE_INGREDIENTE_USADO,

   TB_PRODUTOS.ID_PRODUTO,
   TB_PRODUTOS.NOME_PRODUTO,
   TB_PRODUTOS.DESCRICAO_PRODUTO,
   TB_PRODUTOS.TIPO_PRODUTO,
   TB_PRODUTOS.PRECO_PRODUTO
FROM `TB_INGREDIENTES` 
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = 1
WHERE TB_INGREDIENTES.ACRESCIMO = 1)
UNION ALL
(SELECT 
   TB_INGREDIENTES.ID_INGREDIENTE,
   TB_INGREDIENTES.INGREDIENTE,
   TB_INGREDIENTES.QUANTIDADE_INGREDIENTE_TOTAL,
   TB_INGREDIENTES.FLAG,
    CASE
        WHEN TB_INGREDIENTES.ACRESCIMO = 1 THEN 0
        ELSE TB_INGREDIENTES.ACRESCIMO
    END AS ACRESCIMO, 

   TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES,
   TB_PRODUTOS_INGREDIENTES.QUANTIDADE_INGREDIENTE_USADO,

   TB_PRODUTOS.ID_PRODUTO,
   TB_PRODUTOS.NOME_PRODUTO,
   TB_PRODUTOS.DESCRICAO_PRODUTO,
   TB_PRODUTOS.TIPO_PRODUTO,
   TB_PRODUTOS.PRECO_PRODUTO
FROM `TB_PRODUTOS_INGREDIENTES` 
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = TB_PRODUTOS_INGREDIENTES.ID_PRODUTO
INNER JOIN TB_INGREDIENTES ON TB_INGREDIENTES.ID_INGREDIENTE = TB_PRODUTOS_INGREDIENTES.ID_INGREDIENTE  
WHERE TB_PRODUTOS_INGREDIENTES.ID_PRODUTO = 1)

Error: (1) Unknown column 'TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES' in 'field list'

Tables:

TB_PRODUTOS_INGREDITES

tb_produtos_ingredientes

TB_PRODUTOS

tb_produtos

TB_INGREDITES

tb_ingredientes

I wanted to make a select with these columns, and yes, they exist in the table. But in the first select, before the UNION ALL, if I place the table fields TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES and TB_PRODUTOS_INGREDIENTES.QUANTIDADE_INGREDIENTE_USADO, the Mysql, returns that Error (1). Now, if I exchange those fields for any number, the query runs normal.

Query code executed with any number

(SELECT
   TB_INGREDIENTES.ID_INGREDIENTE,
   TB_INGREDIENTES.INGREDIENTE,
   TB_INGREDIENTES.QUANTIDADE_INGREDIENTE_TOTAL,
   TB_INGREDIENTES.FLAG,
   TB_INGREDIENTES.ACRESCIMO,

   20, -- Colocando qualquer número
   20, -- Colocando qualquer número

   TB_PRODUTOS.ID_PRODUTO,
   TB_PRODUTOS.NOME_PRODUTO,
   TB_PRODUTOS.DESCRICAO_PRODUTO,
   TB_PRODUTOS.TIPO_PRODUTO,
   TB_PRODUTOS.PRECO_PRODUTO
FROM `TB_INGREDIENTES` 
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = 1
WHERE TB_INGREDIENTES.ACRESCIMO = 1)
UNION ALL
(SELECT 
   TB_INGREDIENTES.ID_INGREDIENTE,
   TB_INGREDIENTES.INGREDIENTE,
   TB_INGREDIENTES.QUANTIDADE_INGREDIENTE_TOTAL,
   TB_INGREDIENTES.FLAG,
    CASE
        WHEN TB_INGREDIENTES.ACRESCIMO = 1 THEN 0
        ELSE TB_INGREDIENTES.ACRESCIMO
    END AS ACRESCIMO, 

   TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES,
   TB_PRODUTOS_INGREDIENTES.QUANTIDADE_INGREDIENTE_USADO,

   TB_PRODUTOS.ID_PRODUTO,
   TB_PRODUTOS.NOME_PRODUTO,
   TB_PRODUTOS.DESCRICAO_PRODUTO,
   TB_PRODUTOS.TIPO_PRODUTO,
   TB_PRODUTOS.PRECO_PRODUTO
FROM `TB_PRODUTOS_INGREDIENTES` 
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = TB_PRODUTOS_INGREDIENTES.ID_PRODUTO
INNER JOIN TB_INGREDIENTES ON TB_INGREDIENTES.ID_INGREDIENTE = TB_PRODUTOS_INGREDIENTES.ID_INGREDIENTE  
WHERE TB_PRODUTOS_INGREDIENTES.ID_PRODUTO = 1)

Why does this happen?

Editing

I need the result like this:

Acrescimos

Notice that the brands on amarelo, are the additions.

They are defined by the column acréscimos by number 1. So every record that has the number 1 in the column, is an addition.

  • Have you seen if the column ID_PRODUTOS_INGREDIENTES exists in the table TB_PRODUTOS_INGREDIENTES?

2 answers

2

This is because you are passing a constant instead of a reference.

Instead of you saying: give me back the value that is present in the column TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES. You’re talking, give it back 20

2


I think you need a Join on the first consultation, try it like this:

(SELECT
   TB_INGREDIENTES.ID_INGREDIENTE,
   TB_INGREDIENTES.INGREDIENTE,
   TB_INGREDIENTES.QUANTIDADE_INGREDIENTE_TOTAL,
   TB_INGREDIENTES.FLAG,
   TB_INGREDIENTES.ACRESCIMO,

   TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES,
   TB_PRODUTOS_INGREDIENTES.QUANTIDADE_INGREDIENTE_USADO,

   TB_PRODUTOS.ID_PRODUTO,
   TB_PRODUTOS.NOME_PRODUTO,
   TB_PRODUTOS.DESCRICAO_PRODUTO,
   TB_PRODUTOS.TIPO_PRODUTO,
   TB_PRODUTOS.PRECO_PRODUTO
FROM `TB_INGREDIENTES` 
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = 1
INNER JOIN TB_PRODUTOS_INGREDIENTES ON TB_PRODUTOS_INGREDIENTES.ID_PRODUTO = TB_PRODUTOS.ID_PRODUTO
WHERE TB_INGREDIENTES.ACRESCIMO = 1)
UNION ALL
(SELECT 
   TB_INGREDIENTES.ID_INGREDIENTE,
   TB_INGREDIENTES.INGREDIENTE,
   TB_INGREDIENTES.QUANTIDADE_INGREDIENTE_TOTAL,
   TB_INGREDIENTES.FLAG,
    CASE
        WHEN TB_INGREDIENTES.ACRESCIMO = 1 THEN 0
        ELSE TB_INGREDIENTES.ACRESCIMO
    END AS ACRESCIMO, 

   TB_PRODUTOS_INGREDIENTES.ID_PRODUTOS_INGREDIENTES,
   TB_PRODUTOS_INGREDIENTES.QUANTIDADE_INGREDIENTE_USADO,

   TB_PRODUTOS.ID_PRODUTO,
   TB_PRODUTOS.NOME_PRODUTO,
   TB_PRODUTOS.DESCRICAO_PRODUTO,
   TB_PRODUTOS.TIPO_PRODUTO,
   TB_PRODUTOS.PRECO_PRODUTO
FROM `TB_PRODUTOS_INGREDIENTES` 
INNER JOIN TB_PRODUTOS ON TB_PRODUTOS.ID_PRODUTO = TB_PRODUTOS_INGREDIENTES.ID_PRODUTO
INNER JOIN TB_INGREDIENTES ON TB_INGREDIENTES.ID_INGREDIENTE = TB_PRODUTOS_INGREDIENTES.ID_INGREDIENTE  
WHERE TB_PRODUTOS_INGREDIENTES.ID_PRODUTO = 1)

Not exactly how you want to return the data but maybe:

INNER JOIN TB_PRODUTOS_INGREDIENTES ON TB_PRODUTOS_INGREDIENTES.ID_PRODUTO = TB_PRODUTOS.ID_PRODUTO

Should be:

INNER JOIN TB_PRODUTOS_INGREDIENTES ON TB_PRODUTOS_INGREDIENTES.ID_PRODUTO = TB_PRODUTOS.ID_PRODUTO AND TB_PRODUTOS_INGREDIENTES.ID_INGREDIENTE = TB_INGREDIENTES.ID_INGREDIENTE

Help in the query:

SELECT 
    PI.*,
    I.*,
    P.*
FROM 
    TB_PRODUTOS_INGREDIENTES PI 
INNER JOIN 
    TB_PRODUTO P
    ON PI.ID_PRODUTO = P.ID_PRODUTO
INNER JOIN 
    TB_INGREDIENTE I
    ON PI.ID_INGREDIENTE = I.ID_INGREDIENTE

See if with this query returns all the data, and then you filter and put Where where you think you should.

  • I wanted you to return the produto with their ingredientes, more we believe them. In your select, is returning the product and all ingredientes inserted in the table. Adding the 2nd INNER JOIN, he returns the ingredientes related to the product, but does not bring the accrescimos contained in the table ingredientes. That’s not my goal.

  • Swap all Inner joins for left Oin to see if it solves.

  • @Exception, I believe your Unknown column field problem has been solved. So Joao Paulo’s answer is correct.

  • It is now is to rethink the logic of your query actually. I’ll see if I help you here.

  • @Joaopaulo, Resolved in parts rs. Now the columns ID_PRODUTOS_INGREDIENTES and QUANTIDADE_INGREDIENTE_USADO are returning NULL

  • I put a query that brings all the results. See if it brings the information you want. And if you bring too much just add some Where.

  • @Joaopaulo Certo! But I need UNION ALL to list the ingredientes who are acréscimos and the ingredientes that are from produto and are not acréscimo. Got it?

  • What do you call additions? What information does the field add?

  • @Joaopaulo I will edit the question for you to see how I want the answer of the query.

  • @Joaopaulo Editado!

  • Fine, but just to be clear. Forgetting the database. When you say an ingredient is an addition, what does that mean? That it was added to the product?

  • @Joaopaulo That it can be added to the product. I’m doing so to show them: if(isAcrescimo){ adicionarCheckBoxAcrescimo()} (is just the logic).

  • @Joaopaulo I think I understand what is happening. The columns I said earlier are returning NULL why they are not "tied" to the product. When you have any relationship between ingredientes and produtos, it returns a normal value, but when there is no relationship, it returns NULL instead of your information.

  • I suggest you create another question explaining well the return you want. As you have shown here by supplementing the first question, but as the null question has already been solved I think that if you separate other people you can also help with your other question.

Show 9 more comments

Browser other questions tagged

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