Acesso de três tabelas no MySQL?

A partir de uma tabela de lançamentos pretendo buscar os dados dos usuarios relativos a este grupo na tabela usuario_grupo e o nome do grupo na tabela de grupos.

Me pareceu simples, mas estou recebendo uma mensagem: Erro na edição da lista. Mais de uma tabela envolvida.

Para explicar melhor:

Tabela de lancamentos: id, grupo_id, …


Tabela de grupo: id, descricao, …


Tabela de usuario_grupo: id, usuario_id, grupo_id, data_entrada…

Select * from lancamentos l inner join grupo g on l.grupo_id = g.id 
 inner join usuario_grupo u on u.grupo_id = l.grupo_id

Ao executar, o MySQL traz algumas linhas e dá o erro:

Erro na edição da lista. Mais de uma tabela envolvida.

É por causa do (*) select *, não pode ser assim, pois possui colunas com o mesmo nome, então discrimini cada coluna na SQL:

Exemplo:

SELECT lancamentos.id, lancamentos.grupo_id 
FROM lancamentos l inner join grupo g on l.grupo_id = g.id 
INNER JOIN usuario_grupo u on u.grupo_id = l.grupo_id

Essa SQL eu descriminei os campos, então se precisar dos outros campos da tabelas relacionadas acrescente-os após lancamentos.grupo_id e se por acaso tiver campos com o mesmo nome utilize o AS para renomear.

Infelizmente não deu certo. Tirei o asterisco e coloquei apenas um campo de cada tabela com nome de campo diferente.

Continuou o mesmo erro.

Poste o seu código! (SQL)

Tem um problema também tem chaves agregadas no visto?

Sim as tabelas possuem outras chaves.

SQL

select gl.nivel_acesso, ug.codigo_grupo, g.descricao from grupo_lancamento gl
	inner join usuario_grupo ug on ug.grupo_id = gl.grupo_id
	inner join grupo g on gl.grupo_id = g.id

Tabelas:

CREATE TABLE `grupo_lancamento` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`nivel_acesso` INT(11) NOT NULL,
	`grupo_id` BIGINT(20) NOT NULL,
	`lancamento_id` BIGINT(20) NOT NULL,
	`ultima_atualizacao` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	`versao` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `FK_ivnki8alycnugfiu8kw6xlgac` (`grupo_id`),
	INDEX `FK_3beaf18jxqs5i4rfohwugxpxd` (`lancamento_id`),
	CONSTRAINT `FK_3beaf18jxqs5i4rfohwugxpxd` FOREIGN KEY (`lancamento_id`) REFERENCES `lancamento` (`id`),
	CONSTRAINT `FK_ivnki8alycnugfiu8kw6xlgac` FOREIGN KEY (`grupo_id`) REFERENCES `grupo` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=17

CREATE TABLE `usuario_grupo` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`acesso_tel_end` BIT(1) NOT NULL,
	`codigo_grupo` VARCHAR(10) NOT NULL,
	`data_convite` DATETIME NULL DEFAULT NULL,
	`data_entrada` DATETIME NULL DEFAULT NULL,
	`nivel_acesso` INT(11) NOT NULL,
	`grupo_id` BIGINT(20) NOT NULL,
	`usuario_id` BIGINT(20) NOT NULL,
	`ultima_atualizacao` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	`versao` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `FK_5p20y5panoea7wc040qm6eemd` (`grupo_id`),
	INDEX `FK_m32it4c8rkf6t8nno481k43q4` (`usuario_id`),
	CONSTRAINT `FK_5p20y5panoea7wc040qm6eemd` FOREIGN KEY (`grupo_id`) REFERENCES `grupo` (`id`),
	CONSTRAINT `FK_m32it4c8rkf6t8nno481k43q4` FOREIGN KEY (`usuario_id`) REFERENCES `usuario` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=124

CREATE TABLE `grupo` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`descricao` VARCHAR(60) NOT NULL,
	`id_criador` BIGINT(20) NOT NULL,
	`ultima_atualizacao` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	`versao` INT(11) NOT NULL,
	PRIMARY KEY (`id`),
	INDEX `FK_8md68gpo7ncsfthbq6ic0owst` (`id_criador`),
	CONSTRAINT `FK_8md68gpo7ncsfthbq6ic0owst` FOREIGN KEY (`id_criador`) REFERENCES `usuario` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=98

A tabela grupo_lancamento se relaciona com lancamento (id) e grupo (id) então seria na SQL

SELECT gr.id, gr.nivel_acesso FROM grupo_lancamento gr INNER JOIN
              grupo gp on gp.id = gr.grupo_id

Ai você teria que relacionar com usuario e usuario_grupo talvez ai o design que você fez matou a pau e está ocasionando uma lista no lugar de um row, justificando o erro, porque agora seria usuario_grupo com duas chaves também e na hora da relação grupo_id vai trazer mais resultados ocasionando erros.

Não está errado o design?

Acontece que para o mesmo lancamento existem vários usuarios. Então preciso como retorno: o lancamento e a lista de usuarios deste lancamento (com informações distintas para cada um). O acesso à tabela grupos é para obter a descrição do grupo sem necessidade de repeti-la para todos os usuarios.

Fiz esta query usando hibernate e está funcionando corretamente:

	Session session = manager.unwrap(Session.class);
	Criteria criteria = session.createCriteria(Lancamento.class).
			createAlias("gruposLancamento", "gl").
			createAlias("gl.grupo", "g")
			.createAlias("g.usuariosGrupo", "ug")
			.add(Restrictions.eq("ug.usuario.id", usuarioId));

Estou precisando acessar estas tabelas de outro sistema, sem hibernate, aí surgiu o problema…

Eu entendi, mas, esses agrupamentos que gera um duvida é difícil de dar até uma opinião, sem pegar na mão, se é que me entende.

De qualquer modo, agradeço sua atenção, valeu.

Se conseguir resolver, posto aqui.

Para finalizar este tópico:

Eu estava acessando o mysql usando o HeidiSQL. Os registros que eu queria estavam vindo mas ao final vinha também a mensagem que postei.

Acessando pelo MySQL WorkBench funciona normalmente sem mensagem de erro. Não sei explicar mas para mim esta resolvido. Agradeço mais uma vez o Dragoon pela ajuda.

1 curtida