Jump to content
professor.rafael

Seleção de Várias Tabelas

Recommended Posts

professor.rafael

Caros amigos, gostaria de tirar uma dúvida com os mestres do PHP. Tenho o seguinte script de minhas tabelas:

Create table clientes (
cli_id Int NOT NULL AUTO_INCREMENT,
cli_dt_inclusao Datetime,
cli_nome Varchar(200),
cli_endereco Varchar(200),
cli_bairro Varchar(80),
cli_email Varchar(200),
cli_tel Varchar(15),
cli_cidade Varchar(100),
cli_uf Varchar(2),
Primary Key (cli_id)) ENGINE = MyISAM;

Create table Produtos (
pro_id Int NOT NULL AUTO_INCREMENT,
pro_nome Varchar(200),
pro_qtd Int,
pro_valor Decimal(10,2),
Primary Key (pro_id)) ENGINE = MyISAM;

Create table vendas (
ven_id Int NOT NULL AUTO_INCREMENT,
cli_id Int NOT NULL,
pro_id Int NOT NULL,
ven_data Date,
ven_qtd Int,
ven_valor_unitario Decimal(10,2),
ven_valor_total Decimal(10,2),
Primary Key (ven_id)) ENGINE = MyISAM;

Gostaria de pesquisar todos os nomes dos clientes que moram no cli_uf = “DF” e que compraram algum produto com o ven_id = 1, e listar o nome do produto e data da venda ven_data = 11/03/2011. Desde já agradeço a todos que puderem colaborar e fico no aguardo de seu contato. :down:

Share this post


Link to post
Share on other sites
rippp

Penso ser isso

http://dev.mysql.com/doc/refman/4.1/pt/subqueries.html

talvez algo assim

select clientes.cli_nome as Nome, produtos.pro_nome as Produtos
from clientes, produtos 
where cli_uf="DF" and cli_id="(select cli_id from vendas where ven_id=1)" 
and pro_id="(select pro_id from vendas where vendas id=1)"

Quem souber mais que eu que corige


Java, Android developerhttp://minimalcode.net

Share this post


Link to post
Share on other sites
ribeiro55

Isto não tem nada a haver com PHP ;)

Não precisas de sub-queries.

Experimenta:

SELECT cli.cli_nome Nome, prod.pro_nome Produto, vendas.ven_data Data_Venda

FROM clientes cli,vendas,produtos prod

WHERE cli.cli_uf='DF'

AND vendas.ven_id = 1

Espera lá que agora fiquei baralhado.

Vendas tem uma chave precisamente na coluna que se quer utilizar 1, o que significa que a query vai devolver apenas uma linha.

Como meti anteriormente poderia eventualmente ter de sofrer groupings e portanto sim, vamos às sub-queries.

Não da forma como o rippp colocou, por causa das aspas, mas parecido (sem recorrer a JOIN, pois já efectuei alguns testes e sub-queries são sempre mais rápidas que JOINs, por alguma razão):

SELECT
cli_nome Nome,
(SELECT pro_nome FROM produtos WHERE pro_id = (SELECT pro_id FROM vendas WHERE ven_id = 1)) Produto,
(SELECT ven_data FROM vendas WHERE ven_id = 1) Data_Venda
FROM clientes
WHERE cli_id IN (SELECT cli_id FROM vendas WHERE ven_id = 1)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
professor.rafael

Caro Sérgio, obrigado, no MySql funcionou. Gostaria de saber como faço no PHP. Neste caso eu tenho um formulário onde o usuário vai digitar o estado, por exemplo PR. No formulário que vai executar a consulta eu vou receber o campo $cli_uf, como eu faria a consulta para listar todos os clientes do estado = PR, que compraram algum produto? Fico no aguardo da ajuda.

Share this post


Link to post
Share on other sites
ribeiro55

No PHP é igual. Os comandos SQL são strings.

Basta concatenar as variáveis.

Para condicionar com o estado PR, basta acrescentar um AND na condição, por exemplo:

(...) AND cli_id = '$cli_uf'


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
professor.rafael

Caros amigos, desculpe lhe inportunar novamente, fiz o sql abaixo para listar todos os clientes do estado=PR que compraram um produto, pro_id=9,

SELECT clientes.cli_nome AS Nome, produtos.pro_id AS Código_Produto, produtos.pro_nome as Nome_Produtos FROM clientes,produtos WHERE cli_uf='PR' AND pro_id=(SELECT pro_id FROM vendas WHERE pro_id=9)

Só que esta trazendo clientes do estado=PR que não compraram produto pro_id=9. Onde pode estar o erro? Outra dúvida, pois não consegui implementar, é como listar todos os clientes que compraram algum produto. Desde já agradeço. 😳

Share this post


Link to post
Share on other sites
KTachyon

AND pro_id=(SELECT pro_id FROM vendas WHERE pro_id=9)

Se o pro_id = 9, então o pro_id = 9, tens um segundo select inútil.

Para além disso, seria:

AND pro_id IN (SELECT pro_id FROM vendas WHERE pro_id=9)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
professor.rafael

Olá, obrigado pela resposta, fiz as alterações recomendadas e continua trazendo clientes que não compraram o produto pro_id=9. ;)

Share this post


Link to post
Share on other sites
KTachyon

Porque tens que associar a tabela de clientes à de vendas (e a de vendas à de produtos, que neste caso é directo):

SELECT clientes.cli_nome AS Nome, produtos.pro_id AS Código_Produto, produtos.pro_nome as Nome_Produtos
FROM clientes,produtos WHERE cli_uf='PR' AND vendas.pro_id=9 AND clientes.cli_id = vendas.cli_id


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

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.