Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
olá,
Tenho duas Tabelas a Tabela Notificações e a Tabela Recados quero listar as duas tabelas em uma unica lista sem relacionar as duas tabelas e Ordenar por Data.
TABELA NOTIFICACOES TABELA RECADOS
id id
type de
uid para
action recado
data data
Olá,
è isto Mesmo que Quero Fazer Porem com Essa SQL não dá.
Achei Este Link http://forum.imasters.com.br/topic/293222-resolvido-select-em-duas-tabelas/ e é Isto que Eu Quero Fazer
E Ali Achei Esta SQL:
sql = "SELECT cdevento as codigo, nmevento as nome, dtevento as data, 1 AS identificacao FROM evento "&_" UNION " &_"SELECT cdnoticia as codigo, nmnoticia as nome, dtnoticia as data, 2 AS identificacao FROM noticia "&_"ORDER BY data DESC"
E Modifiquei Ela Para Isto:
SELECT id,de,para,recado,data FROM recados UNION
SELECT id,type,uid,action,data FROM notificacoes ORDER BY data DESC
Porem Quando Executo Exibe Esta Mensagem:
SQLSTATE[HY000]: General error: 1271 Illegal mix of collations for operation 'UNION'
Então Nao Estou Conseguindo Fazer
Opa,
Aparentemente os atributos Character set, Engine e/ou collation estão diferentes.
Quando chegar em casa eu verifico no meu PC ^^
Boa sorte!
Olá, Pesquisei Sobre este erro Na Internet e Modifiquei minha SQL para Essa:
SELECT id,data FROM recados UNION
SELECT id,data FROM notificacoes ORDER BY data DESC
Dai Quanto Fiz o rowCount Retornou o Numero De Linhas Corretas
Mas No Fetch Não Retornou Todos os Resultados
E Presciso De Todos as colunas não somente as colunas id e data
É so alterar para SELECT * FROM, nas duas select.
O * significa ALL.
Ou seja, selecionará todos da tabela desejada.
Acho que é isso.
Para trazer linhas, mesmo com dados repetidos, use UNION ALL.
As colunas tem que ter o mesmo tipo de dados e devem estar na mesma ordem, exemplo (os valores entre < e > é somente para indicar o tipo de dados que estou usando):
SELECT id<int>, nome<varchar>, data_cadastro<datetime>, 'usuario' as tipo FROM usuarios
UNION ALL
SELECT id<int>, titulo<varchar>, data_publicacao<datetime>, 'noticia' as tipo FROM noticias
Veja que, para facilitar a identificação de cada registro, o retorno traz também uma coluna extra contendo o tipo do registro (usuario ou noticia).
@braços e fique com Deus!
Continua Dando Este Erro:
SQLSTATE[HY000]: General error: 1271 Illegal mix of collations for operation 'UNION'
Verificou se em ambas tabelas, você está utilizando o mesmo charset?
Exemplo:
Na tabela de noticia, na coluna titulo, você está usando UTF-8.
Na tabela usuario, na coluna nome, você está usando LATIN-1.
Quando isto ocorre, este erro é disparado.
Discussão parecida:
https://github.com/hananils/subsectionmanager/issues/185
@braços
>
Verificou se em ambas tabelas, você está utilizando o mesmo charset?
Exemplo:
Na tabela de noticia, na coluna titulo, você está usando UTF-8.
Na tabela usuario, na coluna nome, você está usando LATIN-1.
Quando isto ocorre, este erro é disparado.
Discussão parecida:
https://github.com/hananils/subsectionmanager/issues/185
@braços
Consegui Fazer :)
Os Collations Estavam Diferentes Nas Duas Tabelas
Então só Troquei Eles
Agora Estou Com Outro Problema Preciso Selecionar as Notificações e Recados somente de Quem é meu Amigo e Tentem Fazer com um INNER JOIN porem não deu certo.
Tabela Amizades
id
de
para
status
MInha SQL:
SELECT * ,1 AS tipo FROM notificacoes AS r UNION ALL
SELECT *, 2 AS tipo FROM recados AS r
INNER JOIN amizade a ON (((r.uid=a.de) AND (a.para=?)) OR ((r.uid=a.para) AND (a.de=?)))
ORDER BY data DESC
Ao Executar Isto Aparece o Seguinte Erro
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'r.uid' in 'on clause'
Tenta assim:
SELECT * FROM (
SELECT * ,1 AS tipo FROM notificacoes
UNION ALL
SELECT *, 2 AS tipo FROM recados
) as r
INNER JOIN amizade a ON (((r.uid=a.de) AND (a.para=?)) OR ((r.uid=a.para) AND (a.de=?)))
ORDER BY data DESC
@braços
>
Tenta assim:
SELECT * FROM (
SELECT * ,1 AS tipo FROM notificacoes
UNION ALL
SELECT *, 2 AS tipo FROM recados
) as r
INNER JOIN amizade a ON (((r.uid=a.de) AND (a.para=?)) OR ((r.uid=a.para) AND (a.de=?)))
ORDER BY data DESC
@braços
Deu Certo :joia:
O select deu certo mas retorna os campos da tabela amizade também como faço para isto não Acontecer?
troque
select * from
por
select r.* from
@braços!
>
troque
select * from
por
select r.* from
@braços!
Obrigado, Resolveu o Problema :D
Olá Cesar,
Acho que é algo assim:
ORDER BY notificacoes.dataOu pode usar ALIAS xD
Não entendi muito bem sua dúvida, mas acho que é isso!
Boa sorte aew o/