Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cassiano óliver

[Resolvido] Select de registros para 3 possíveis usuários

Recommended Posts

Pessoal, boa tarde,

 

Em um site, tenho um sistema de comentários, onde é permitido apenas comentar quem esteja logado no site.

Há 3 tipos de usuários: Organizadores de eventos, Usuários e Bandas.

 

Nos comentários serão exibidos os campos: Nome (para usuários e bandas), Empresa (para organizadores), data do comentário e foto.

 

Comentários

CREATE TABLE IF NOT EXISTS `eventos_coment` (
  `cid` int(10) NOT NULL AUTO_INCREMENT,
  `eid` int(10) NOT NULL DEFAULT '0',
  `uid` smallint(5) NOT NULL,
  `origem` varchar(20) COLLATE utf8_unicode_ci NOT NULL, // usuário, organizador ou banda
  `de` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `email` varchar(80) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `comentario` text COLLATE utf8_unicode_ci NOT NULL,
  `data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`cid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

Bandas

CREATE TABLE IF NOT EXISTS `bandas` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `data_cadastro` date NOT NULL,
  `imagem` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `dir` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

Usuários

CREATE TABLE IF NOT EXISTS `usuarios_site` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `pasta` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
  `foto` char(11) COLLATE utf8_unicode_ci NOT NULL,
  `data_cadastro` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

Organizadores

CREATE TABLE IF NOT EXISTS `organizadores` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `empresa` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `pasta` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
  `logo` char(11) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

MInha dificuldade é, selecionar o nome ou empresa e a pasta/foto para cada comentário, já que pode ser enviado por um usuário, organizador ou banda.

 

Cada um possui uma pasta diferente.

 

Com a SQL abaixo, eu consigo listar, porém se em alguma tabela não houver alguem cadastrado, não retorna nada.

EX: Há organizadores e usuários cadastrados, porém, nenhuma banda.

 

Selecionando as 4 tabelas, não retorna nada, mesmo havendo registro, pois não há bandas cadastradas.

SELECT *, org.pasta AS pastaOrg, user.pasta AS pastaUser FROM eventos_coment AS cmt, organizadores AS org, usuarios_site AS user, bandas AS bnd WHERE eid = $id || (cmt.uid = org.id && cmt.origem = 'organizador') || (cmt.uid = user.id && cmt.origem = 'usuario') ORDER BY cmt.data DESC

Já assim, exibe os comentários, pois não selecionei a tabela bandas.

SELECT *, org.pasta AS pastaOrg, user.pasta AS pastaUser FROM eventos_coment AS cmt, organizadores AS org, usuarios_site AS user WHERE eid = $id || (cmt.uid = org.id && cmt.origem = 'organizador') || (cmt.uid = user.id && cmt.origem = 'usuario') ORDER BY cmt.data DESC

Se alguém puder dar uma idéia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw pela dica.

Estudei essa função, funcionou perfeitamente.

 

a SQL ficou assim:

SELECT
cmt.de, cmt.email, cmt.origem, cmt.comentario, DATE_FORMAT(cmt.data, '%d/%m/%Y %H:%i') AS dataCmt,
org.pasta AS pastaOrg, org.logo AS logo,
user.pasta AS pastaUser, user.foto AS fotoUser,
bnd.dir AS pastaBnd, bnd.imagem AS fotoBnd
FROM eventos_coment AS cmt
LEFT JOIN organizadores AS org ON cmt.uid = org.id
LEFT JOIN usuarios_site AS user ON cmt.uid = user.id
LEFT JOIN bandas AS bnd ON cmt.uid = bnd.id
WHERE cmt.eid = $id  
ORDER BY dataCmt DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.