Consulta em multiplas tabelas mysql

1,488 views
Skip to first unread message

Leo Baiano

unread,
Aug 22, 2010, 10:25:27 AM8/22/10
to listaphp
Pessoal, estou precisando fazer uma consulta em mais de uma tabela do
banco, pesquisando na net vi alguma sugestões de usar o union, mas
tentei e não deu certo, fiz assim:

$sql = "select * from table1 where texto LIKE '%".$busca."%'
union
select * from table2 where texto LIKE '%".$busca."%'";
$resultado = mysql_query($sql);

E depois criei um loop com while para exibir os resultados, mas
retorna o seguinte erro:

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given

e não retorna resultado nenhum, gostaria de saber onde estou errando e
se esta é realmente a forma correta para se fazer uma consulta em
multiplas tabelas.

--
Amplexos,

Leo Baiano
http://www.leobaiano.com
http://www.blog.ljunior.com
http://www.mcelebridades.com
http://www.twitter.com/leobaiano

felipe moraes

unread,
Aug 22, 2010, 10:30:15 AM8/22/10
to list...@googlegroups.com
Leo ..

no mysql acho que não tem union .. mas não tenho certeza agora

Agora,

para ele funcionar .. vc precisa que as querys tenham a mesma quantidade de campos e que os campos seja do mesmo tipo ..

select id, nome, telefone from table1
union
select id, nome, celular from table2

id - integer

nome, telefone e celular como string ..

e tem de estar na mesma posição ..

inteiro com inteiro .. data com data .. string com string.. etc ..


--
============================================================
LEIAM SEMPRE AS REGRAS DA LISTA:
http://groups.google.com.br/group/listaphp/web/regras-da-lista-php
--
LISTA PHP > http://groups.google.com.br/group/listaphp
--
REVISTA PHP > http://www.revistaphp.com.br
--
AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
--
PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
--
DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
============================================================



--
http://felipebastosweb.com.br
http://twitter.com/felipebastosweb

Marcel Araujo

unread,
Aug 22, 2010, 10:47:17 AM8/22/10
to list...@googlegroups.com
Claro que mysql tem UNION.

Gente, são comandos DDL que a maioria dos SGDBs possuem então vamos cuidar ai para não falarmos besteira.

Amigo, como o amigo Felipe já mencionou, talvez não esteja funcionando pela quantiade de colunas que CADA select esteja trazendo. Teste diretamente no banco esta consulta. O warning se justifica pela consulta estar errada, portanto, o mysql_query não retorna um resource mas sim um valor null ou false.


--
Abraços......

Marcel Araujo
System Analyst
Manager at CodeIgniterBR
Developer jQuery/PHP/Flex/CodeIgniter
Linux User #490101
http://br.linkedin.com/in/marcelaraujo
http://www.twitter.com/marcelaraujo
http://www.marcelaraujo.com.br

felipe moraes

unread,
Aug 22, 2010, 10:57:32 AM8/22/10
to list...@googlegroups.com
ok,

como ele não tem minus, intersect e outros comandos .. imaginei que não tinha union também .. e errei

Leo Baiano

unread,
Aug 22, 2010, 10:58:23 AM8/22/10
to list...@googlegroups.com
Realmente parece que o problema é o número de colunas, quando testei
direto no banco apareceu o erro:

#1222 - The used SELECT statements have a different number of columns

Acho que não entendi direito o que é esse lance de quantidade de
colunas, nos dois selects estou fazendo a busca em 3 campos.

Essa é a unica e/ou melhor forma de se fazer uma consulta em multiplas
tabelas? No meu caso as tabelas não são parecidas e a quantidade de
campos pesquisados em cada uma nem sempre será a mesma, então se essa
for uma limitação do union não vai servir.

2010/8/22, Marcel Araujo <cece...@gmail.com>:

felipe moraes

unread,
Aug 22, 2010, 11:01:33 AM8/22/10
to list...@googlegroups.com
sim .. precisa sempre ter o mesmo numero de colunas .. e as colunas precisam ter o mesmo tipo .. em cada query .. pois é operação de conjuntos ..

acho que vai ter de apelar para o JOIN .. subquerys, etc ..

Gilberto M O Otani

unread,
Aug 22, 2010, 3:17:14 PM8/22/10
to list...@googlegroups.com
Sinceramente não acho q vc deva usar o union. Ele é usado em casos bem
específicos, dependendo de como vc quer juntar essas tabelas o JOIN é
bem melhor.

2010/8/22 Leo Baiano <ljuni...@gmail.com>:

> --
> ============================================================
> LEIAM SEMPRE AS REGRAS DA LISTA:
> http://groups.google.com.br/group/listaphp/web/regras-da-lista-php
> --
> LISTA PHP > http://groups.google.com.br/group/listaphp
> --
> REVISTA PHP > http://www.revistaphp.com.br
> --
> AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
> --
> PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
> --
> DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
> ============================================================

--
Gilberto M O Otani
gilbert...@gmail.com

Ícaro Souza

unread,
Aug 22, 2010, 3:21:29 PM8/22/10
to list...@googlegroups.com
Teste primeiro somente SQL, só depois execute-o no php.

Abraços
Ícaro Souza
www.icarosouza.net

seco

unread,
Aug 23, 2010, 7:11:23 AM8/23/10
to LISTA PHP
Meu caro se você souber como fazer joins e em alguma das duas tabelas
tiver uma chave estrangeira que associe uma a outra, entao use JOIN.

On 22 ago, 16:21, Ícaro Souza <icar...@gmail.com> wrote:
> Teste primeiro somente SQL, só depois execute-o no php.
>
> Abraços
> Ícaro Souzawww.icarosouza.net
>
> Em 22 de agosto de 2010 16:17, Gilberto M O Otani
> <gilberto.ot...@gmail.com>escreveu:
>
> > Sinceramente não acho q vc deva usar o union. Ele é usado em casos bem
> > específicos, dependendo de como vc quer juntar essas tabelas o JOIN é
> > bem melhor.
>
> > 2010/8/22 Leo Baiano <ljunior2...@gmail.com>:
> > gilberto.ot...@gmail.com

Rubens Takiguti Ribeiro

unread,
Aug 22, 2010, 3:14:25 PM8/22/10
to list...@googlegroups.com
Felipe Moraes, como você faria isso com JOIN ou com subquery?

O que vejo de errado é usar o atalho "*" em uma consulta que usa UNION. Mesmo que as tabelas envolvidas tivessem o mesmo número de colunas (e estivessem na mesma ordem), não deveria ser usado "*", pois em determinado ponto do desenvolvimento poderia surgir a necessidade de se criar uma nova coluna em uma das tabelas e a consulta pararia de funcionar.

O correto é especificar quais campos devem ser consultados da primeira e da segunda tabela, sendo que estes campos precisam ser especificados na ordem em que ocorre a correspondência de valores. Ou seja, o primeiro campo da primeira tabela deve ser do mesmo tipo que o primeiro campo da segunda, etc.

É só ler o manual: http://dev.mysql.com/doc/refman/5.0/en/union.html

Rubens Takiguti Ribeiro
TecnoLivre - Cooperativa de Tecnologia e Soluções Livres
Bacharel em Ciência da Computação - UFLA
Zend Certified Engineer - PHP 5


2010/8/22 felipe moraes <feli...@gmail.com>
--

Rubens Takiguti Ribeiro

unread,
Aug 22, 2010, 3:21:37 PM8/22/10
to list...@googlegroups.com
Ah, sim, uma observação importante:
não é necessário que as duas tabelas tenham a mesma quantidade de colunas.

O que precisa é que os campos retornados pelo primeiro SELECT seja correspondente aos campos retornados pelo segundo SELECT.

Se a tabela X tem os campos a, b, c, mas a tabela Y tem os campos a, b, então é possível um UNION assim:
SELECT a, b FROM x
 UNION
SELECT a, b FROM y;

Ou, se quiser retornar o campo "c" da tabela X e colocar um valor padrão para "c" que não existe em Y, talvez isso funcione:
SELECT a, b, c FROM x
 UNION
SELECT a, b, 'valor padrão' FROM y;

Sendo que "valor padrão" precisaria ser do mesmo tipo que a coluna "c".


Rubens Takiguti Ribeiro
TecnoLivre - Cooperativa de Tecnologia e Soluções Livres
Bacharel em Ciência da Computação - UFLA
Zend Certified Engineer - PHP 5


Leo Baiano

unread,
Aug 23, 2010, 9:12:14 AM8/23/10
to list...@googlegroups.com
Vou tentar fazer com JOIN, na verdade não são apenas duas tabelas, são mais que duas...

felipe moraes

unread,
Aug 23, 2010, 9:22:09 AM8/23/10
to list...@googlegroups.com
opa ..

vc pegou a discussão pelo 1/2 do caminho ..

eu especifiquei claramente em post anterior que era relativo ao SELECT ..

select bla1,bla2,bla3 from tabela1
union
select bla1,bla2,bla3 from tabela2

os selects devem possuir o mesmo numero de colunas e as colunas devem ser do mesmo tipo ... bla1 com bla1, bla2 com bla2.. etc [conforme exemplo em post anterior]

ainda dei o mesmo link do manual para que pudesse retirar todas as duvidas ..

vamos questionar apenas coisas contextualizadas .. flw


Em 22 de agosto de 2010 16:14, Rubens Takiguti Ribeiro <rub...@gmail.com> escreveu:
Felipe Moraes, como você faria isso com JOIN ou com subquery?

O que vejo de errado é usar o atalho "*" em uma consulta que usa UNION. Mesmo que as tabelas envolvidas tivessem o mesmo número de colunas (e estivessem na mesma ordem), não deveria ser usado "*", pois em determinado ponto do desenvolvimento poderia surgir a necessidade de se criar uma nova coluna em uma das tabelas e a consulta pararia de funcionar.

O correto é especificar quais campos devem ser consultados da primeira e da segunda tabela, sendo que estes campos precisam ser especificados na ordem em que ocorre a correspondência de valores. Ou seja, o primeiro campo da primeira tabela deve ser do mesmo tipo que o primeiro campo da segunda, etc.

É só ler o manual: http://dev.mysql.com/doc/refman/5.0/en/union.html

Reply all
Reply to author
Forward
0 new messages