Mysql Order By com duas tabelas

1. Mysql Order By com duas tabelas

Rodrigo Kulb
RodrigoKulb

(usa Ubuntu)

Enviado em 16/01/2009 - 16:21h

Mysql Order By com duas tabelas

Eu preciso efetuar um ORDER BY com duas tabelas mais não pode listar uma e depois a outra exemplo:

3 tabelas Cadastro, PessJur, PessFis

SELECT * FROM Cadastro INNER JOIN (PessJur)
ON (Cadastro.idCadastro = PessJur.idCadastro)
INNER JOIN (PessFis) ON (Cadastro.idCadastro = __leviminPessFis.idCadastro)
ORDER BY PessJur.nomeFantPessJur, PessFis.nomeComplePessFis ASC

Até funciona ele ordena por nome mais o problema é que primeiro pega a tabela PessFis e depois PessJur
eu quero que ORDER BY por nome.

alguem já passou por isso ???


  


2. estou procurando e não acho

Rodrigo Kulb
RodrigoKulb

(usa Ubuntu)

Enviado em 19/01/2009 - 11:05h

estou procurando e não acho em nenhum lugar.

gostaria de entrelaçar o order by das duas tabelas

EX:

Antonio (nome PF)
Bruno (nome PF)
Bavaria (nome PJ)
Caio (nome PF)
Carrefour (nome PJ)

e NÃO assim:

Antonio (nome PF)
Bruno (nome PF)
Caio (nome PF)
Bavaria (nome PJ)
Carrefour (nome PJ)




3. Ola

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 19/01/2009 - 12:17h

Ola amigo.
Primeiro somente para esclarecimento, seu problema é um problema de modelagem incorreta de dados. O correto seria armazenar as informações na mesma tabela, utilizando um flag para tal. Porém há situações que possamos precisar de tal junção, para isso se utiliza a função UNION.
Sua utilização não é recomendada por deixar as consultas lentas, por isso falei da modelagem, porém dependendo do volume de informações vai funcionar bem.
Basta fazer:
(SELECT PessJur.nomeFantPessJur as nome FROM Cadastro INNER JOIN (PessJur) ON (Cadastro.idCadastro = PessJur.idCadastro)
)
UNION
(SELECT PessFis.nomeComplePessFis as nome FROM Cadastro INNER JOIN (PessFis) ON (Cadastro.idCadastro = PessFis.idCadastro))
ORDER BY nome;

Se não funcionar é algum parenteses errado pois não testei a query. Boa sorte


4. Ola stremer

Rodrigo Kulb
RodrigoKulb

(usa Ubuntu)

Enviado em 19/01/2009 - 14:32h

Ola stremer obrigado pela ajuda,

eu programava assim mais apos fazer o curso de UML mudei meus conceitos.

Eu acredito que montar 3 tabelas uma pai CADASTRO e as filhas PESFIS e PESJUR. e uma forma mais completa e correta de estrutura.

Bom não quero utilizar union pois também acho que atrasa o resultado de pesquisa.

alguem tem uma outra solução ???


5. amigo

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 19/01/2009 - 17:42h

desculpe mas se fez um curso... este curso te ensinou a maneira errada...
criar uma tabela pai para o cadastro e os detalhes paras as filhas desta maneira esta incorreto.
Você até pode ser informações especificas nas tabelas de pessoa fisica e nas tabelas de pessoa juridica, porém o nome que é comum de ambas deveria ficar na tabela comum entre elas...
e nesse caso não vai ter como fugir do union... haverá sim perda de performance... as vezes é preciso penalizar a modelagem estrutural em pró da performance...
um banco de dados não é magico... ele trabalha com informações em tabelas... se você precisa unir duas tabelas terá de fazer isto em tempo de execução, a não ser que utilize oracle/db2 é possivel fazer visões materializadas... não conheco uma maneira de fazer estas tabelas em mysql... tem de dar uma pesquisada se é possivel.


6. No caso

Rodrigo Kulb
RodrigoKulb

(usa Ubuntu)

Enviado em 19/01/2009 - 19:05h

no caso nomeFantasia não é mesma coisa que nomeContato

mais meu cliente quer que a listagem de ambos no mesmo campo EX: "nome" / "nome fantasia"

como posso ordenar isto entende.

sendo coisas totalmente diferentes ??

inserir no mesmo local na base de dados ??

não existe outra maneira em mysql ???


7. opa

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 20/01/2009 - 10:10h

agora ficou mais claro...
Você tem o nome da pessoa fisica e o nome (razão) da pessoa juridica...
tem tbem o nome fantasia... que só pertence a pessoa juridica ou seja, fica na tabela de detalhes da pessoa juridica...
e o cara quer a ordenação por 2 coisas diferentes...
nesse caso não tem como fugir do union não...
a não ser que modele de maneira incorreta (salvando na tabela principal um campo nome pesquisa 1 (nome pessoa fisica + razao pessoa juridica) e nome pesquisa 2 (nome pessoa fisica + nome fantasia juridica), ou seja... gambiarra...
Assim deve-se usar o union mesmo não tem mto o que se fazer...
Tem que dar uma pesquisada se existe view materializada no mysql, que seria um tipo de uma tabela temporária com esta informação que poderia ter indice para melhorar a performance...
Em tempo de execução não é muito legal de se fazer... mas se quiser seguir a risca a metodologia de armazenamento das informações... terá de usar o union mesmo.
boa sorte


8. ae

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 20/01/2009 - 10:17h

uma pequena busca no google vi que tem a partir da versão
MySQL 5.0.2
eles chama de index view... ou seja, você cria uma visão (fazendo o union) e depois cria um indice no campo nome...
mesmo assim como falei, não sei se funciona e se da pra implementar legal... eu só usei em oracle (snapshot) e em db2 (mqt).
Boa sorte


9. obrigado stremer

Rodrigo Kulb
RodrigoKulb

(usa Ubuntu)

Enviado em 20/01/2009 - 10:46h

Obrigado stremer tive uma idéia boa.

vou criar um campo 'Resumo' na tabela cadastro.

Ele será a copia do campo "Nome da Pessoa" OU "Nome Fantasia".

Pronto resolvido e sem abalar performasse do banco de dados.

obrigado pela luz stremer.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts