Inner join repeating data

1

I use a query using the inner join, but the problem is that it duplicates the results I have a table in mysql that is called produtos_destaque where id_produtoDestaque is a foreign key in the benefits table. My problem is that a product can have up to 5 benefits and at the time of showing the data in php all products that have more than 1 benefit is duplicated

SELECT produto_destaque.*,beneficio.beneficio 
FROM produto_destaque 
INNER JOIN beneficio ON produto_destaque.id_produtoDestaque = beneficio.id_produtoDestaque

I tried to use group by and I did not succeed. How could you solve this problem?

This is the return you have from my query with the inner

    
asked by anonymous 12.01.2017 / 06:43

1 answer

5

The JOIN lists two tables, relating the data as if it were all part of a single table, composed of the two.

Here's a good explanation of how it works:

  

What's the difference between INNER JOIN and OUTER JOIN?


If you need multiple fields of beneficios

In your case, if you want all the benefits, but once only each product, you can do this organization through PHP, something like this:

$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) die( $mysqli->connect_error );

// usei o * por nao saber seus campos. na pratica use só os que precisa
$mysqli->query( 'SELECT * FROM produto_destaque' ) or die($mysqli->error);
$res = $mysqli->use_result();

// criamos um array vazio para guardar os produtos
$produtos = array();
while ($row = $res->fetch_assoc()) {
    // em cada produto acrescentamos um lugar para os beneficios
    $row['beneficios'] = array();
    // e guardamos a linha em $produtos
    $produtos[$row['id_produtoDestaque']] = $row;
}
$res->free();

// em seguida, vamos pegar todos os beneficios
$mysqli->query( 'SELECT * FROM beneficio' ) or die($mysqli->error);
$res = $mysqli->use_result();

while ($row = $res->fetch_assoc()) {
    // agora guardamos o beneficio na chave 'beneficios' do 
    // produto correspondente, que criamos no SELECT anterior
    $produtos[$row['id_produtoDestaque']]['beneficios'][] = $row;
}
$res->free();

// aqui é só para conferir o resultado
print_r( $produtos );


If you need a field only

If you need a benefit-only field, as comrade @mauhumor commented, you can use group_concat :

SELECT     produto_destaque.*, GROUP_CONCAT( beneficio.beneficio )
FROM       produto_destaque 
INNER JOIN beneficio
           ON produto_destaque.id_produtoDestaque = beneficio.id_produtoDestaque
GROUP BY   produto_destaque.id_produtoDestaque
  

Working with group_concat

    
12.01.2017 / 07:06