Jump to content
mr.ice

Dúvida em query SQL

Recommended Posts

mr.ice

Boas..

Penso não ser o sitio mais correcto mas como não encontrei nenhuma secção para SQL e trabalho PHP, aqui vai..

Tenho a seguinte estrutura

Clientes

id

nome

nprocesso

nelemento

Nesta tabela guardo os dados do cliente e sua familia, diferenciado pelo campo nelemento

Servicos

id

idcliente

servico

Precisava de obter os clientes que têm pelo menos um servico, bem como os elemento da sua familia.

Para obter os clientes que têm o servico estou a utilizar a seguinte query e funciona o problema, é ele me mostrar também os elementos da familia, ou seja os que têm nelemento >0

SELECT clientes.* FROM clientes LEFT OUTER JOIN servicos ON clientes.id=servicos .idcliente WHERE servicos .idservico=5)

Peço desculpa se não fui muito claro..

Obrigado desde já..

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Penso não ser o sitio mais correcto mas como não encontrei nenhuma secção para SQL e trabalho PHP, aqui vai..

Fizeste bem em colocar a questão na mesma. O quadro de SQL (genérico) é este:

http://www.portugal-a-programar.pt/forum/71-bases-de-dados/

Quanto à query, penso que com uma subquery resolves a questão:

-- Lista todos os clientes que contêm serviços (neste caso com o id do serviço = 5)
SELECT * FROM clientes WHERE id IN (SELECT idcliente FROM Servicos WHERE idservico=5)

PS: Não percebi a condição idservico = 5 pois não referiste no texto, por isso deixei essa condição na mesma.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
mr.ice

Nem com óculos... :wallbash:

A condição idservico é o que permite saber se o cliente pertence a determinado servico.

Obrigado pela sugestão, mas isso eu já consigo fazer de outra maneira..

Eu preciso da lista de todos os clientes e elementos dessa familia que têm servico 5

Em que eu sei que pertence à familia pelo nprocesso.

Exemplo dados tabela clientes

id        nprocesso      nelemento    nome

1                1                0                  x

2                1                2                  y

3                2                0                  h

não sei se estou a ser claro..

Share this post


Link to post
Share on other sites
Rechousa

Algumas questões:

1. O campo nelemento representa o quê? O número de elementos da família?

2. Tens alguma forma de relacionar (outra tabela que não esteja aqui representada, por exemplo) os elementos da família ou apenas tens o número de elementos da família?

Eu preciso da lista de todos os clientes e elementos dessa familia que têm servico 5

3. Quando acima dizes "lista de todos os clientes e elementos" referes-te a quê? Ao número de elementos?


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
mr.ice

1. Sim..As linhas da tabela são do género

id        nprocesso      nelemento    nome

1                1                0                  x

2                1                2                  y

3                2                0                  h

em que o nprocesso identifica o id do cliente, e o nelemento as pessoas que pertencem ao seu agregado.

Identifico como 0 o cliente, e os restantes por 2,3,4,5...

2. Não.

3. Refiro ao dados dos elementos..

Para além de me mostrar os clientes que têm idservico=5, queria que me mostrassem também os registos que têm o mesmo n.º processo, mas outro n.º elemento, mas que podem não ter nenhum dado no serviço...

Exemplos de dados..

tabela clientes

id        nprocesso      nelemento    nome

1                1                0                  x

2                1                2                  y

3                2                0                  h

tabela servicos

id        idcliente      idservico

1                1                5               

2                1                6

3                2                6

4                2                7

5                3                8

Resultado pretendido

id        nprocesso      nelemento    nome

1                1                0                  x

2                1                2                  y

Em que me mostra o cliente que tem um servico=5 e os elemento do seu agregado

Não sei se fui mais confuso.. :P

Share this post


Link to post
Share on other sites
brunoais

Uma coisa destas?

SELECT nprocesso, nelemento, nome  FROM clientes
WHERE nprocesso IN (
	SELECT nprocesso  FROM clientes
		INNER JOIN servicos ON idcliente = clientes.id AND idservico = 5 
	)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mr.ice

Boas..

Preciso reabrir este tópico, porque neste momento apesar da consultar funcionar está-me a demora 520seg a ser executada..

Existe alguma maneira de poder reduzir o tempo?

Share this post


Link to post
Share on other sites
Caça

Tenta reescrever a query, caso o resultado não seja positivo, podes sempre criar um Index.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
pmg

select nprocesso, nelemento, nome
from clientes, servicos
where servicos.idservico = 5
  and servicos.idcliente = clientes.nprocesso;

Ao contrario do SQL anterior (com um "JOIN" e um "IN"), aqui so tens um "JOIN" (em formato 'antigo': nunca me habituei ao formato 'novo'). Ve la se se torna mais rapido ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
mr.ice

só uma correção na tua sugestão

servicos.idcliente = clientes.nprocesso

é falso.

o correcto seria

servicos.idcliente = clientes.id

, mas assim não me mostra os clientes que têm o  mesmo nprocesso e nelemento diferente

Share this post


Link to post
Share on other sites
pmg

Qual e a relacao do "y" com o servico "5"?

A maneira que eu interpretei e que o "y" tem o processo "1" e o processo "1" passa a ser chamado 'idcliente' na tabela de servicos e portanto "usa" os servicos "5" e "6".

Outra vez: qual e a relacao do "y" com o servico "5"?


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
mr.ice

a estrutura da tabela é a seguinte

clientes

idcliente    nprocesso  nelemento  nome

1                    1                  0              x

2                    1                  1              y

3                    2                  0              z

servicos

id              idcliente          idservico

1                      1                    5

2                      3                    5

Eu quero que mostra todos os clientes que têm idservico = 5, e os clientes que têm nelemento >0 desses clientes, mas que não necessariamente têm algum registo nos servicos

a pesquisa neste caso devia devolver todos os dados dos clientes

Não sei fui claro.

Share this post


Link to post
Share on other sites
pmg

????

Os clientes com id "1" e "3" ambos tem o nelemento a "0" ==> portanto nao deviam aparecer, certo? ????

O cliente com id "2" nao existe na tabela de servicos ==> portanto nao devia aparecer, certo? ????


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
mr.ice

Errado nas duas..

O cliente 1 e 3 devem aparecer porque ambos têm um registo com idservico=5

E o cliente 2 deve aparecer porque tem o mesmo nprocesso que o cliente 1

Share this post


Link to post
Share on other sites
pmg

Vamos la a ver ... nao sei se e mais rapido que a versao anterior.

mysql> -- Clientes com servico=5
mysql> create view clientes_5 as
    -> select clientes.* from clientes, servicos
    -> where servicos.idservico = 5 and servicos.idcliente = clientes.idcliente;
Query OK, 0 rows affected (0.01 sec)

mysql> -- Processos com servico=5
mysql> create view processo_5 as
    -> select nprocesso
    -> from clientes
    -> where idcliente in (select idcliente from servicos where idservico = 5);
Query OK, 0 rows affected (0.00 sec)

mysql> -- Clientes com (processos com servico=5)
mysql> create view clientes_processo_5 as
    -> select *
    -> from clientes
    -> where nprocesso in (select nprocesso from processo_5);
Query OK, 0 rows affected (0.00 sec)

mysql> -- Tudo junto
mysql> select * from clientes_5
    -> union
    -> select * from clientes_processo_5;
+-----------+-----------+-----------+------+
| idcliente | nprocesso | nelemento | nome |
+-----------+-----------+-----------+------+
|         1 |         1 |         0 | x    |
|         3 |         2 |         0 | h    |
|         2 |         1 |         1 | y    |
+-----------+-----------+-----------+------+
3 rows in set (0.01 sec)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
mr.ice

peço, desculpa mas ainda não tive tempo de testar..

mas pelo que percebi o objectivo será criar query "fixas" no mysql server e depois ir buscá-las..

Isso pode me causar um problema, porque o idservico que é 5, pode ir, para já até 20.

Share this post


Link to post
Share on other sites
mr.ice

Já testei, e continua a demorar o mesmo tempo.

Eu tenho as tabelas em InnoDB, não sei se faz alguma diferença.

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

×
×
  • 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.