Busca em duas tabelas

(AdrianoBr) #1

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) #2

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) #3

Valeu pela ajuda Haroldo.
Agora vem outra pergunta: Como eu monto o camando SQL e onde eu coloco comando?
Desculpa pela ignorância.

(Haroldo) #4

manda a estrutura das duas tabelas que podemos ajudar sim.

(Diogo Toscano) #5

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) #6

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) #7

Assim que eu conseguir um tempo, monto um esqueminha para vc, se alguém aqui se manifestar antes, ótimo.

(Diogo Toscano) #8

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) #9

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á

(Haroldo) #10

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

(Eduardo Alves) #11

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;