Jump to content
Sign in to follow this  
ruimcosta

Obter dados de uma tabela...

Recommended Posts

ruimcosta

Biba,

Tenho um problema ao tentar obter os dados de clientes de uma base de dados totalmente mal estruturada para criação do ficheiro saft-pt.

Para conseguir obter dados do cliente (nome, morada, etc) para o saft, tenho de os obter via tabela Facturas. Ora nesta tabela, tenho várias facturas para o mesmo cliente e o meu problema reside em obter o cliente único. Não posso utilizar o distinct, porque tenho dados diferentes para o mesmo cliente, tipo o cliente mudou de residência e esses dados ficam registados na tabela facturas.

Por isso preciso de seleccionar id_cliente, nome, morada, cp, localidade,nif, telefone e dataregisto sabendo que algum registos aparecerão em duplicado e necessito que desses duplicados, seleccione apenas o último.

Tenho isto "resolvido" via php e com dois select's, será possível simplificar com um único select?


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
M6

A forma mais simples (e limpa) é precisamente fazeres isso na base de dados.

Se puderes trabalhar na base de dados cria uma view a partir do select que já tens. Ordena esse select e escolher apenas o registo mais recente (não sei se tens uma data ou algo assim que te permita saber qual é o mais recente). Podes usar a função rank (http://stackoverflow.com/questions/3333665/mysql-rank-function) para filtrares apenas o registo que te interessa.

Depois no PHP basta fazeres o select à view. Isto permite-te que quem consulte essa view tenha a informação de cliente "limpa" e uniformizada (dentro do possível). Se todos os acessos aos dados do cliente forem feitos por ai isso vai permitir minimizar os erros que essa bd tem.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
ruimcosta

Biba,

Obrigado M6. Aqui tenho o select:

select 
   distinct numcliente, dataregisto, facturas.nome, morada, codigopostal1, codigopostal2, 
   localidade, nif, paises.codigo as pais 
  from facturas
      inner join paises on facturas.pais = paises.id
  order by numcliente asc, dataregisto desc

Isto retorna:

selectmysql.png

Agora preciso de nessa selecção, dos registos seleccionados, manter apenas o 1º nessa lista.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
M6

Experimenta assim:

select 
   distinct numcliente, max(dataregisto) as dataregisto, facturas.nome, morada, codigopostal1, codigopostal2, 
   localidade, nif, paises.codigo as pais 
  from facturas
      inner join paises on facturas.pais = paises.id
group by  numcliente, facturas.nome, morada, codigopostal1, codigopostal2, 
order by numcliente asc, dataregisto desc


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
ruimcosta

Biba

Tirando a vírgula no final da linha group by, impec.

Obrigado


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
M6

É isso mesmo.

Cria uma view com isso e usa-a.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.