Tenho um relatorio que não consigo implementar

Tenho uma Estrutura de Resolução (ER) simples:
tb_cadpessoa (id_cad, nm_nome)
tb_cadpessoa_tb_telefone ER (tb_cadpessoa_id_cad, tb_telefone_id_telefone) FK
tb_telefone (id_telefone, cd_telefone)

Preciso fazer um relatorio de consultas (SELECT) onde faça um GROUP_CONCAT a coluna cd_telefone mas de forma automatica, para não aparecer duplicidade de nomes.
o mais proximo que eu cheguei foi isso, armezenar numa variavel 1 nome, mas não é o que eu preciso, pois pois o relatorio tem multiplas linhas! quando tiro fora a varavel e subistutuo pelo nome da coluna, aparece todos os telefones ligados a 1 nome:
onde esta o erro?

select nm_nome AS NOME,GROUP_CONCAT(cd_telefone SEPARATOR ’ / ') as CELULARES
from tb_cadpessoa, tb_cadpessoa_has_tb_telefone, tb_telefone
WHERE id_cadastroPessoa = tb_cadpessoa_id_cadastroPessoa AND id_telefone = tb_telefone_id_telefone
ORDER BY id_telefone;

Com base na sua informação, eu montei um ambiente de testes aqui com MySQL 8.

Usei isto para criar as tabelas:

CREATE TABLE tb_cadpessoa (
  id_cad INT PRIMARY KEY,
  nm_nome VARCHAR(100) NOT NULL
);

CREATE TABLE tb_telefone (
  id_telefone INT PRIMARY KEY,
  cd_telefone VARCHAR(11) NOT NULL
);

CREATE TABLE tb_cadpessoa_tb_telefone(
  tb_cadpessoa_id_cad INT,
  tb_telefone_id_telefone INT,
  PRIMARY KEY (tb_cadpessoa_id_cad, tb_telefone_id_telefone),
  FOREIGN KEY (tb_cadpessoa_id_cad) REFERENCES tb_cadpessoa(id_cad),
  FOREIGN KEY (tb_telefone_id_telefone) REFERENCES tb_telefone(id_telefone)
);

INSERT INTO tb_cadpessoa VALUES (1, 'João'), (2, 'Pedro'), (3, 'Maria');

INSERT INTO tb_telefone VALUES
  (1, '11111111111'), (2, '22222222222'), (3, '33333333333'),
  (4, '44444444444'), (5, '55555555555'), (6, '66666666666'),
  (7, '77777777777'), (8, '88888888888'), (9, '99999999999');

INSERT INTO tb_cadpessoa_tb_telefone VALUES
  (1, 1), (1, 2), (1, 3),
  (2, 4), (2, 5), (2, 6),
  (3, 7), (3, 8), (3, 9);

E o SELECT ficou assim:

SELECT
  nm_nome AS NOME,
  GROUP_CONCAT(cd_telefone SEPARATOR ' / ') AS CELULARES
FROM tb_cadpessoa, tb_cadpessoa_tb_telefone, tb_telefone
WHERE id_cad = tb_cadpessoa_id_cad AND id_telefone = tb_telefone_id_telefone
GROUP BY nm_nome;

Comparando com a sua tentativa, eu só adicionei o GROUP BY.

E este foi o resultado:

NOME CELULARES
João 33333333333 / 22222222222 / 11111111111
Maria 99999999999 / 88888888888 / 77777777777
Pedro 66666666666 / 55555555555 / 44444444444

no mysql 7 eu fiz o que vc falou e o resultado é o mesmo! Não resolveu.

Vê certinho aí porque não existe MySQL 7. E eu testei na versão 8.0 e na 5.7 e deu certinho.

Me passa os comando exatos que vc usou para eu reproduzir aqui no meu computador, assim eu consigo ajudar melhor.

Os comandos que eu usei, que mostrei ali em cima, foram baseados na sua explicação, então podem estar diferentes do que vc tem aí. Por isso estou pedindo para vc colocar aqui seus CREATE TABLES, para eu copiar direto da fonte.

Outra coisa é que não ficou claro pra mim o que vc quer dizer com “Não resolveu”. Deu erro ou o quê? É que ficou estranho porque na sua primeira mensagem, o nome das suas tabelas e colunas não batem com os nomes das tabelas e colunas que vc usou no SELECT, então estou achando que tem algo errado nas informações que vc passou. Confere aí e nos atualize.

putz desculpe eu to tão zuado meu php é o 7! testei o comunity (8) é aparece todos os telefone concatenados. vou rever isso amanha acho que o BO ta no meu create table eu vi aqui, o relacionamento com Objeto de Resolução com as FK não estão (cascade) no update e nem no delete, deve ser isso? Que idiota e falta de atenção. te respondo amanhã! Valeu Parceiro.
to romando canseira pq to a 2 anos sem desenvolver DB to so no front end e corrigindo erros.
Obrigado.

1 curtida

wldomiciano:
Tu não imagina pq tava errado…
não troquei o ORDER BY…
Caaaaaaara sinistro! o climax da desatenção e do esgotamento!
Agora ta certinho! VLW.
CASO RESOLVIDO!