Autor Tópico: Busca em duas tabelas  (Lida 5021 vezes)

AdrianoBr

  • Novato
  • *
  • Mensagens: 5
    • Email
Busca em duas tabelas
« Online: Julho 05, 2010, 01:17:54 pm »
Pessoal, eu sou novo em programação PHP e ScriptCase.
Preciso de ajuda.
Eu preciso buscar o preço de um produto em duas tabelas: Produtos e preço especial.
Caso o produto exista nas duas tabelas, eu devo carregar o preço da tabela preço especial, caso contrário eu devo carregar o preço da tabela produtos.
Eu não tenho a menor idéia de como fazer isso no scriptcase.
Agradeço desde já.

Haroldo

  • Expert
  • *****
  • Mensagens: 6276
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re: Busca em duas tabelas
« Responder #1 Online: Julho 05, 2010, 01:29:34 pm »
Isso não requer conhecimento de PHP ou Scriptcase, e sim de SQL.
Primeiro eu construiria uma view para as duas tabelas, onde teria um select com union, apartir daí é só usar o case.

AdrianoBr

  • Novato
  • *
  • Mensagens: 5
    • Email
Re: Busca em duas tabelas
« Responder #2 Online: Julho 05, 2010, 02:34:44 pm »
Valeu pela ajuda Haroldo.
Agora vem outra pergunta: Como eu monto o camando SQL e onde eu coloco comando?
Desculpa pela ignorância.

Haroldo

  • Expert
  • *****
  • Mensagens: 6276
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re: Busca em duas tabelas
« Responder #3 Online: Julho 05, 2010, 02:45:45 pm »
manda a estrutura das duas tabelas  que podemos ajudar sim.

Isso não requer conhecimento de PHP ou Scriptcase, e sim de SQL.
Primeiro eu construiria uma view para as duas tabelas, onde teria um select com union, apartir daí é só usar o case.


Diogo Toscano

  • Administrator
  • Expert
  • *****
  • Mensagens: 590
    • :: ScriptCase ::
    • Email
Re: Busca em duas tabelas
« Responder #4 Online: Agosto 08, 2010, 12:56:11 am »
seria apenas uma left join de produtos com preco especial e um case para testar se o preco especial for null, pega o preco de produtos, se nao, pega o preco da preco especial.

espero ter ajudado.

AdrianoBr

  • Novato
  • *
  • Mensagens: 5
    • Email
Re: Busca em duas tabelas
« Responder #5 Online: Agosto 18, 2010, 11:17:48 am »
Harold,
Me desculpe pela demora, mas tive alguns problemas e faz quase 2 meses q ñ desenvolvo nada.
Mas abaixo está a estrutura das tabelas, como vc havia pedido:

CREATE TABLE tb_produtos (
  id_produtos SMALLINT UNSIGNED NOT NULL,
  descricao VARCHAR(40) NOT NULL,
  unidade_entrega VARCHAR(2) NULL,
  valor_unitario NUMERIC(12,2) NULL,
  PRIMARY KEY(id_produtos),
  INDEX tb_produtos_index1038(descricao)
);

CREATE TABLE tb_produtos_esp (
  id_cadastro INTEGER UNSIGNED NOT NULL,
  id_produtos SMALLINT UNSIGNED NOT NULL,
  valor_unitario NUMERIC(12,2) NOT NULL,
  PRIMARY KEY(id_cadastro, id_produtos)
);

Obrigado pela ajuda.

Haroldo

  • Expert
  • *****
  • Mensagens: 6276
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re: Busca em duas tabelas
« Responder #6 Online: Agosto 18, 2010, 11:20:56 am »
Assim que eu conseguir um tempo, monto um esqueminha para vc, se alguém aqui se manifestar antes, ótimo.



Harold,
Me desculpe pela demora, mas tive alguns problemas e faz quase 2 meses q ñ desenvolvo nada.
Mas abaixo está a estrutura das tabelas, como vc havia pedido:

CREATE TABLE tb_produtos (
  id_produtos SMALLINT UNSIGNED NOT NULL,
  descricao VARCHAR(40) NOT NULL,
  unidade_entrega VARCHAR(2) NULL,
  valor_unitario NUMERIC(12,2) NULL,
  PRIMARY KEY(id_produtos),
  INDEX tb_produtos_index1038(descricao)
);

CREATE TABLE tb_produtos_esp (
  id_cadastro INTEGER UNSIGNED NOT NULL,
  id_produtos SMALLINT UNSIGNED NOT NULL,
  valor_unitario NUMERIC(12,2) NOT NULL,
  PRIMARY KEY(id_cadastro, id_produtos)
);

Obrigado pela ajuda.

Diogo Toscano

  • Administrator
  • Expert
  • *****
  • Mensagens: 590
    • :: ScriptCase ::
    • Email
Re: Busca em duas tabelas
« Responder #7 Online: Agosto 23, 2010, 11:30:16 am »
Eu fiz de cabeça, então seria necessario testar:

SELECT
   tbp.id_produtos,
   tbp.descricao,
   tbp.unidade_entrega,
   CASE WHEN tbpe.valor_unitario>0 THEN tbpe.valor_unitario ELSE tbp.valor_unitario END as valor_unitario
FROM
   tb_produtos tbp LEFT OUTER JOIN tb_produtos_esp tbpe ON tbp.id_produtos = tbpe.id_produtos

Do mais, pra n ficar dando select direto na join, voce pode criar uma view:

create view vw_produtos as SELECT
   tbp.id_produtos,
   tbp.descricao,
   tbp.unidade_entrega,
   CASE WHEN tbpe.valor_unitario>0 THEN tbpe.valor_unitario ELSE tbp.valor_unitario END as valor_unitario
FROM
   tb_produtos tbp LEFT OUTER JOIN tb_produtos_esp tbpe ON tbp.id_produtos = tbpe.id_produtos


e na aplicação basta dar um select * from vw_produtos que iria ficar transparente pra voce.

so precisa testar se quando n tem na especial isso é falso: tbpe.valor_unitario>0
se nao teria que testar tbpe.valor_unitario>0 or tbpe.valor_unitario is not null ....

Eduardo Alves

  • Avançado
  • ****
  • Mensagens: 262
    • SLords Informatica
    • Email
Re: Busca em duas tabelas
« Responder #8 Online: Novembro 25, 2010, 11:01:31 am »
Tentei varias formas. Teria jeito de eu fazer um select no meu mysql desta forma (reparem que estou com duas tabelas diferentes)

 SELECT  (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli = 'P')  AS Entrada,
 
         (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli <> 'P')  AS Saida,
         
         (SELECT COUNT(*) FROM adm_clientes) AS total FROM adm_clientes
                 
         (SELECT COUNT(*) FROM adm_os) AS ost FROM adm_os;   

tentei tb:

SELECT
   COUNT(os.id) AS total,
   COUNT(clie.Tpcli) AS certo
FROM
   adm_os os,
   adm_clientes clie

tb tentei assim:

SELECT COUNT(ClienteId) AS t FROM adm_clientes

UNION

SELECT COUNT(ID) AS g FROM adm_os

UNION

SELECT COUNT(ClienteId) AS i FROM adm_clientes WHERE Tpcli = 'P'

mais não deu certo, so aparece a primeira coluna


Obs: se eu usar somente a tabela adm_clientes ele fica 100%, mais como trabalhar com 2 tabelas diferentes como no modo apresentado acima ??

Agradeço a colaboração desde já
Eduardo Alves
Gestor de TI e Segurança de Dados
Tel: (11) 8400-0224 (TIM) – Nextel: Id: 5 * 4522
email: analista@slords.com.br skype: analista.slords
www.slords.com.br

Haroldo

  • Expert
  • *****
  • Mensagens: 6276
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re: Busca em duas tabelas
« Responder #9 Online: Novembro 25, 2010, 12:15:46 pm »
SELECT  (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli = 'P')  AS Entrada,
 
         (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli <> 'P')  AS Saida,
        
         (SELECT COUNT(*) FROM adm_clientes) AS total,
                 
          COUNT(*) FROM adm_os) AS ost FROM adm_os;   


ou

SELECT COUNT(ClienteId),"total"  FROM adm_clientes

UNION all

SELECT COUNT(ID),"g"  FROM adm_os

UNION all

SELECT COUNT(ClienteId),"i.." FROM adm_clientes WHERE Tpcli = 'P'

//AQUI SAI O POR LINHAS MESMO



Tentei varias formas. Teria jeito de eu fazer um select no meu mysql desta forma (reparem que estou com duas tabelas diferentes)

 SELECT  (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli = 'P')  AS Entrada,
 
         (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli <> 'P')  AS Saida,
        
         (SELECT COUNT(*) FROM adm_clientes) AS total FROM adm_clientes
                 
         (SELECT COUNT(*) FROM adm_os) AS ost FROM adm_os;   

tentei tb:

SELECT
   COUNT(os.id) AS total,
   COUNT(clie.Tpcli) AS certo
FROM
   adm_os os,
   adm_clientes clie

tb tentei assim:

SELECT COUNT(ClienteId) AS t FROM adm_clientes

UNION

SELECT COUNT(ID) AS g FROM adm_os

UNION

SELECT COUNT(ClienteId) AS i FROM adm_clientes WHERE Tpcli = 'P'

mais não deu certo, so aparece a primeira coluna


Obs: se eu usar somente a tabela adm_clientes ele fica 100%, mais como trabalhar com 2 tabelas diferentes como no modo apresentado acima ??

Agradeço a colaboração desde já

Eduardo Alves

  • Avançado
  • ****
  • Mensagens: 262
    • SLords Informatica
    • Email
Re: Busca em duas tabelas
« Responder #10 Online: Novembro 25, 2010, 01:57:09 pm »
blz mano..vlw..

Ficou assim:

SELECT  (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli = 'P')  AS Entrada,
 
        (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli <> 'P')  AS Saida,
         
        (SELECT COUNT(*) FROM adm_clientes) AS total,
                 
        (SELECT COUNT(*) FROM adm_os WHERE situacao_os = '1') AS ost FROM adm_os LIMIT 1;

SELECT  (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli = 'P')  AS Entrada,
 
         (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli <> 'P')  AS Saida,
        
         (SELECT COUNT(*) FROM adm_clientes) AS total,
                 
          COUNT(*) FROM adm_os) AS ost FROM adm_os;   


ou

SELECT COUNT(ClienteId),"total"  FROM adm_clientes

UNION all

SELECT COUNT(ID),"g"  FROM adm_os

UNION all

SELECT COUNT(ClienteId),"i.." FROM adm_clientes WHERE Tpcli = 'P'

//AQUI SAI O POR LINHAS MESMO



Tentei varias formas. Teria jeito de eu fazer um select no meu mysql desta forma (reparem que estou com duas tabelas diferentes)

 SELECT  (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli = 'P')  AS Entrada,
 
         (SELECT COUNT(*) FROM adm_clientes WHERE Tpcli <> 'P')  AS Saida,
        
         (SELECT COUNT(*) FROM adm_clientes) AS total FROM adm_clientes
                 
         (SELECT COUNT(*) FROM adm_os) AS ost FROM adm_os;   

tentei tb:

SELECT
   COUNT(os.id) AS total,
   COUNT(clie.Tpcli) AS certo
FROM
   adm_os os,
   adm_clientes clie

tb tentei assim:

SELECT COUNT(ClienteId) AS t FROM adm_clientes

UNION

SELECT COUNT(ID) AS g FROM adm_os

UNION

SELECT COUNT(ClienteId) AS i FROM adm_clientes WHERE Tpcli = 'P'

mais não deu certo, so aparece a primeira coluna


Obs: se eu usar somente a tabela adm_clientes ele fica 100%, mais como trabalhar com 2 tabelas diferentes como no modo apresentado acima ??

Agradeço a colaboração desde já
Eduardo Alves
Gestor de TI e Segurança de Dados
Tel: (11) 8400-0224 (TIM) – Nextel: Id: 5 * 4522
email: analista@slords.com.br skype: analista.slords
www.slords.com.br