Jump to content

Archived

This topic is now archived and is closed to further replies.

Paczkovski

Como utilizar o comando UNION

Recommended Posts

Estou quebrando cabeça aqui para fazer união das tabelas gostaria de saber como faço da forma correta, segue a baixo codigo:

 

$palavra = str_replace(" ", "%", strip_tags($HTTP_GET_VARS['busca']));

	$SQL = (SELECT * FROM tbmaterias WHERE nome LIKE '%".$palavra."%') UNION
	(SELECT * FROM tbmaterias_categorias WHERE categoria LIKE '%".$palavra."%') ORDER BY id_categoria ASC;


	$Lista = new Consulta($SQL,1000,$PGATUAL);

	$Lista1 = new Consulta($SQL,1000,$PGATUAL);

	$i=0;

       while ($linha1 = db_lista($Lista1->consulta)) { $i++;

		$categoria[$linha1['id_categoria']] = $linha1['categoria'];

	}


	if (db_linhas($Lista->consulta)>0) {

?>

Share this post


Link to post
Share on other sites

Você deve ter a mesma quantidade de colunas em ambos os selects, senão o union não vai funcionar. Evite usar *(tudo). Especifique o nome de cada campo.

 

Mas pelo o que eu entendi, você quer retornar a categoria de determinada matéria, isso?

 

 

Se sim, utilize joins e não union.

Share this post


Link to post
Share on other sites

O comando union serve para juntar duas consultas, sem cruzar os dados.

 

É útil para mostrar listagem gerais de tabelas diferentes. Como em uma escola, para saber o nome de todo o corpo discente e docente (alunos e professores).

 

SELECT nome FROM alunos
UNION
SELECT nome FROM professores

 

Assim ele mostrará o nome de todos os alunos e, após, o nome de todos os professores.

 

Já o join, serve para cruzar os dados entre tabelas. Como no seu caso:

- Você possui uma lista com matérias e uma com categorias;

- Uma matéria possui apenas uma categoria;

- Uma categoria possui N matérias.

 

Consegue ver a relação dos dados?

 

O problema do JOIN é a sua utilidade. 99% dos select's, com mais de uma tabela, se usa join(inner e outer). Os outros 1% envolve union, minus, sub-select, entre outros.

Não é um problema exatamente, mas se eu lhe der a solução pronta, você não vai aprender. E isso pode ser um obstáculo na sua carreira (foi na minha :pinch:).

 

Leia este artigo, e eventuais dúvidas, poste novamente no fórum.

http://www.luis.blog.br/join-ou-juncoes-sql-inner-left-right-e-full-outer-join.aspx

 

PS.: Só não escrevo uma explicação completa, pois estou sem tempo agora :lol:

Share this post


Link to post
Share on other sites

to tentando aqui mais meio complicado pode ajudar mais ou menos assim que fiz.

 

$SQL= "SELECT * FROM tbmaterias LEFT JOIN tbmaterias_categorias ON nome = categoria LIKE '%".$palavra."%' ORDER BY nome ASC";

Share this post


Link to post
Share on other sites

Certo, vamos lá.

 

Os join são utilizados para cruzamento de tabelas principalmente, não somente, FK -> PK. Existe uns joins, como o cross, que não necessariamente é feito pelo ID.

 

Vou dar um exemplo de duas tabelas.

 

Tabela Grupo:

id | titulo
1 | Administrador
2 | Membro

 

Tabela Usuario:

id | id_grupo | nome
1 | 2        | Gabriel Heming
2 | 2        | Paczkovski
3 | 1        | Fulano da Silva

 

Bom, temos duas tabelas e alguns dados.

Agora eu quero saber qual é o grupo de cada usuário.

Vamos por partes.

 

P: O que eu quero?

R: O nome de todos os usuários e a qual grupo cada um pertence.

 

P: Aonde eu consigo esses dados?

R: Os usuários estão na tabela usuario e o grupo estão na tabela grupo.

 

P: Como é a referência de um usuário para o seu grupo?

R: Através da coluna id_grupo. Ela referencia o id da tabela grupo.

 

Com isso, vamos montar o sql (comentado):

'
SELECT
  U.nome, /** nome do usuário **/
  G.titulo AS grupo, /** Grupo do usuário -> a constante AS, define um apelido para a exibição da coluna **/
FROM
  usuario U
  INNER JOIN grupo G ON (G.id = U.id_grupo);'

 

Saída:

nome             | grupo
Gabriel Heming   | Membro
Paczkovski       | Membro
Fulano da Silva  | Administrador

 

Você também deve saber a diferença entre INNER JOIN (convencional), LEFT JOIN e RIGHT JOIN.

 

No INNER JOIN, vai retornar somente os resultados que estiverem de acordo com a cláusula especificada: (G.id = U.id_grupo). Se por algum motivo, um usuário não possua grupo, ele não aparecerá.

 

No LEFT JOIN, você vais mostrar todos os dados da tabela da esquerda (LEFT -> esquerda). No nosso exemplo, é a tabela Usuários. Então, se algum usuário não possui grupo, ele aparecerá mesmo assim. Entretanto, não haverá nenhum grupo na coluna grupo.

 

No RIGHT JOIN, é o contrário do left. Ele irá mostrar todos os resultados da tabela da direita (RIGHT -> direita), mesmo se não existir na tabela da esquerda. No nosso exemplo, iremos exibir todos os usuários que possuam grupo. E também os grupos que não possuem usuários. Os usuários que não possuem grupos, não serão mostrados.

 

Peço ao pessoal que perceber, se eu escrevi alguma inconsistência, corrijam :thumbsup:

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.