Ir para conteúdo

POWERED BY:

Arquivado

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

João Paulo Belentani

Selecionar todos os campos de varias tabelas MySQL

Recommended Posts

ja tentei union e funciona apenas em 2 tabelas, pois têm o mesmo numero de colunas tento assim

SELECT * FROM videos UNION ALL
SELECT * FROM imagens UNION ALL
SELECT * FROM conteudo

apenas para teste direto no PHPadmin e nao rola.

mas com videos e imagens rola. porque elas sao identicas.

eu quero selecionar tudo pois tem um campo em comum, que eh a data+hora,

 

pois vou exibir as informações de varias tabelas em ordem cronologica ou seja ORDER BY datai DESC

sacaram?

quero que pegue TODOS os registros de 3 ou mais TABELAS.

como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para que o union funcione, todas as consultas tem que retornar o mesmo número de colunas, e o tipo de dados tem que ser igual em cada uma delas, exemplo (o que está entre < e > é o tipo da coluna).

SELECT id<int>, nome<varchar> FROM usuario
UNION ALL
SELECT codcliente<int>, nome_completo<varchar> FROM cliente
UNION ALL
SELECT id<int>, url<varchar> FROM conteudo

Neste caso, UNION trará os resultados de todas as tabelas informadas.

Se elas tiverem correlação, utilize JOIN como sugerido pelo hinom.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, uma aulinha basica, quando uso join e quando uso union?

 

Editado:


Pô gente to apanhando aki, o SQL ta executando o comando mas nao exibe o quer tem neles: to tentando normal

 

Select videos.*, imagens.*, conteudo.* FROM videos, imagens, conteudo (funciona mas nao exibe)

Select * from videos FULL JOIN imagens FULL JOIN conteudo
nao rola tb!

select * from (Select * from videos FULL JOIN imagens)FULL JOIN conteudo
#1060 - Duplicate column name 'id'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Joins você para fazer um relacionamento entre duas ou mais tabelas, já union você usa para juntar o resultado de duas ou mais consultas SQL lembrando que para juntar duas consultas tem que seguir a regrinhas ja citada pelo hufersil no tópico #3.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom gente, to pensando aqui e acho que este nao vai ser meu caso. nem UNION e nem JOIN.

axo melhor eu fazer um select para cada TABELA.

porem, a minha ideia é a seguinte:

 

 

videos

ID NOME TIPO DATA

1 1234.avi video 1/1/1-12:12:59(no caso seria sem barra e pontos e traços)

 

imagens

ID NOME TIPO DATA

1 abcde.jpg imagem 111121359

 

conteudo

ID TITULO CORPO DATA

1 titulo1 corpo1 111121459

 

quero exibilar conforme adicionado ao BD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho meio suicídio fazer isso ai, porque a longo prazo, essa consulta pode ficar pesada.

Mas, se você quer fazer o que está no inicio do tópico, o melhor é UNION.

 

Só que este teu campo DATA ai tá zuado. Em cada tabela tá de um jeito diferente (pelo que parece).

 

Sugestão: sempre armazene os valores com os tipos correspondentes ao que ele é. Se você vai gravar datas, utilize o tipo date. Se vai gravar data e hora, utilize o tipo datetime.

 

Supondo que você ajuste o campo "data" de cada tabela para usar datetime:

SELECT * FROM (
  SELECT id, nome, data, "video" as tipo FROM videos
  UNION
  SELECT id, nome, data, "imagem" as tipo FROM imagens
  UNION
  SELECT id, titulo as nome, data, "conteudo" as tipo FROM conteudo
) as q
ORDER BY data ASC
LIMIT 0, 30

E ainda poderia colocar condições

SELECT * FROM (
  SELECT id, nome, data, "video" as tipo FROM videos
  UNION
  SELECT id, nome, data, "imagem" as tipo FROM imagens
  UNION
  SELECT id, titulo as nome, data, "conteudo" as tipo FROM conteudo
) as q
WHERE q.tipo = 'video'
ORDER BY data ASC
LIMIT 0, 30

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, aquela data diferente ja diz entre parentes "SEM BARRAS E PONTUAÇÕES" nas outras eu coloquei o jeito correto. preferi especificar esta DATAI deste jeito porque as vezes 2 usuarios postas coisas ao mesmo tempo e eu quero que exiba a por ultimo, primeiro!. mas obrigado pela sugestão só nao entendo a parte do

 

>>>"tabela" as tipo FROM tabela<<<<

 

e outra duvida

ao invez de

>>> SELECT id, nome, data, "video" as tipo FROM videos UNION<<<

nao posso usar

 

>>> SELECT * "video" as tipo FROM videos UNION<<<



O problema é que videos e imagens tem uma coluna a mais! e não posso descartar nenhuma de todas as tabelas e nao tenho nada a acrescentar na tabela de conteudo. como faço?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre postagens simultaneas:

Utilize o order by. Mesmo que a data de postagem seja igual, o código de identificação será diferente.

order by data ASC, id ASC

 

Sobre "tabela" as tipo FROM tabela

Não é o nome da tabela que está entre aspas. É uma string de identificação que será usada no resultado. Assim você sabe se o registro é proveniente da tabela imagem, video ou conteudo. Ali você pode usar qualquer valor

SELECT * FROM (
  SELECT id, nome, data, "bar" as tipo FROM videos
  UNION
  SELECT id, nome, data, "foo" as tipo FROM imagens
  UNION
  SELECT id, titulo as nome, data, "baz" as tipo FROM conteudo
) as q
ORDER BY data ASC
LIMIT 0, 30

 

Sobre usar asterisco

Utilizar asterisco é um risco, ainda mais falando-se que vai utilizar union.

As tabelas podem ter um número de colunas diferentes e tipos de dados diferentes.

 

E mesmo que você tenha certeza absoluta, líquida e certa de que as tabelas no momento que você está desenvolvendo tenham as colunas na mesma ordem/quantidade, um dia você pode adicionar um campo e vai "quebrar" uma funcionalidade que não tinha problemas e não tinha nada a ver com o que você esta trabalhando no momento, acarretando uma demora para descobrir o motivo dela ter parado de funcionar. E mesmo que não seja você, pode ser outro da sua equipe.

 

Procure sempre em suas consultas especificar exatamente quais colunas você quer trazer no resultset. Além de evitar erros, evita tráfego de informações desnecessárias e alivia a carga do SGBD.

 

Se uma tabela tem uma coluna a mais que a outra, especifique no select da tabela que não tem a coluna que deverá trazer nulo:

SELECT * FROM (
  SELECT id, nome, data, coluna_a_mais, "video" as tipo FROM videos
  UNION
  SELECT id, nome, data, coluna_a_mais, "imagem" as tipo FROM imagens
  UNION
  SELECT id, titulo as nome, data, NULL as "coluna_a_mais", "conteudo" as tipo FROM conteudo
) as q
ORDER BY data ASC
LIMIT 0, 30

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.