Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

LordFusion

LIKE e RLIKE de outra tabela

Recommended Posts

Olá pessoal estou com uma dúvida.

 

Preciso fazer o seguinte SELECT:

SELECT calldate AS data, src AS origem, dst AS destino, SEC_TO_TIME(billsec) AS duracao,

(SELECT CASE WHEN billsec >= 1 AND billsec <= 30 THEN ROUND((custo/2),2) WHEN billsec > 30 AND (billsec%6 = 0) THEN ROUND((billsec/6)*custo,2) ELSE ROUND(FLOOR((billsec/6)+1)*custo,2) END) AS valor

FROM rotas, tarifas

WHERE DATE_FORMAT(calldate, '%Y-%m-%d')

BETWEEN '2010-04-01'

AND '2010-04-31'

AND disposition = 'ONLINE'

AND channel LIKE 'S%'

AND dstchannel LIKE 'S%'

AND dcontext = 'route'

AND billsec >= 3

AND (dst NOT LIKE '55%'

AND dst NOT LIKE '86%'

AND dst NOT LIKE '___'

AND dst NOT LIKE '_____'

AND dst = LIKE (cod_area))

ORDER BY calldate DESC;

 

 

 

Os campos em negritos pertecem a tabela "tarifas". O que eu preciso é que o LIKE busque os códigos na outra tabela.

Sem consultar a tabela tarifa eu faria assim: (teria que alterar também o "custo" para o valor "23.50" por exemplo)

 

 

"AND (dst NOT LIKE '55%'
AND dst NOT LIKE '0800%'
AND dst NOT LIKE '___'
AND dst NOT LIKE '_____'
[b]AND dst LIKE '1%'[/b])"

Aí preciso buscar esse código lá no campo "cod_area' da tabela "tarifas". Do contrário tenho que fazer um SELECT para a tarifa de cada código. O que ia ficar gigantesco, sem contar que os valores das tarifas sofrem alterações, ai teria que alterar cada SELECT, quando alguma tarifa fosse alterada. Pensem fazer isso em mais de 400 cidades??? http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

 

A tabela "tarifa" está assim:

cod_area, area, custo

1, SP, 23.50

2, RJ, 29.90

3, PR, 32.50

 

Ai o SELECT vai verificar os códigos e aplicar os valores, conforme os dados da tabela "tarifas".

 

Nisso vem a dúvida, qual a sintaxe correta para fazer essa consulta? Pois o que estou tentando sei que está errado. ;)

 

Desde já agradeço a ajuda de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao entendi exatamente o q você quer, mas acho q eh +- isso q você quer

 

...
WHERE DATE_FORMAT(calldate, '%Y-%m-%d')
BETWEEN '2010-04-01'
AND '2010-04-31'
AND disposition = 'ONLINE'
AND channel LIKE 'S%'
AND dstchannel LIKE 'S%'
AND dcontext = 'route'
AND billsec >= 3
AND (dst NOT LIKE '55%'
AND dst NOT LIKE '86%'
AND dst NOT LIKE '___'
AND dst NOT LIKE '_____')
AND dst = cod_area
ORDER BY calldate DESC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa...grande giesta (Alf boy ^_^) !!!

 

Nao entendi exatamente o q você quer, mas acho q eh +- isso q você quer

...WHERE DATE_FORMAT(calldate, '%Y-%m-%d')BETWEEN '2010-04-01'AND '2010-04-31'AND disposition = 'ONLINE'AND channel LIKE 'S%'AND dstchannel LIKE 'S%'AND dcontext = 'route'AND billsec >= 3AND (dst NOT LIKE '55%'AND dst NOT LIKE '86%'AND dst NOT LIKE '___'AND dst NOT LIKE '_____')AND [b]dst = cod_area[/b] ORDER BY calldate DESC;

Então isso pra mim não funciona, por que tem códigos que são maiores. Por exemplo

204535

203211

207644

 

Ai eu quero filtrar somente pelos dois, três ou quatro primeiros dígitos. Sem o acesso a segunda tabela eu uso "LIKE '20%'" então queria fazer a mesma coisa com o campo cod_area da tabela tarifas. Assim eu posso buscar e tarifar todas as cidades com começam com 20, pois geralmente ela o mesmo valor.

 

Ficou mais claro agora!!! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah tah...

 

vamos melhorar o codigo entao...

 

WHERE DATE_FORMAT(calldate, '%Y-%m-%d')
BETWEEN '2010-04-01'
AND '2010-04-31'
AND disposition = 'ONLINE'
AND left(channel,1) = 'S'
AND left(dstchannel,1) = 'S'
AND dcontext = 'route'
AND billsec >= 3
AND 
(
left(dst,2) NOT IN (55,86)
AND dst NOT IN ('___','_____')
AND left(dst,2) = left(cod_area,2)
)
ORDER BY calldate DESC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estamos quase lá. Funcionou, mas tem algumas inconsistências.

 

Para usar com os códigos abaixo. Pelo que você passou funciona legal

204535

203211

207644

 

Só que agora estou com outro problema, eu também tenho os seguintes códigos,

129768

134636

141235

 

543215

543123

543767

 

Ai quero puxar só pelo número 20, 1, e 543. Então fiz assim:

 

WHERE DATE_FORMAT(calldate, '%Y-%m-%d')

BETWEEN '2010-04-01'

AND '2010-04-31'

AND disposition = 'ONLINE'

AND left(channel,1) = 'S'

AND left(dstchannel,1) = 'S'

AND dcontext = 'route'

AND billsec >= 3

AND

(

left(dst,2) NOT IN (55,86)

AND dst NOT IN ('___','_____')

AND left(dst,1) = left(cod_area,1)

AND left(dst,2) = left(cod_area,2)

AND left(dst,3) = left(cod_area,3)

)

ORDER BY calldate DESC;

 

No caso, só adicionei mais dois "LEFT'S". Um para pegar os códigos "1" e outro para pegar os códigos "543". Porém... O resultado devia me retornar 125 registros. E só veio 82. O outros 43 pertecem ao código "1".

 

O que é preciso fazer para trazer esses três resultados?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

...
(

( left(dst,2) NOT IN (55,86) AND dst NOT IN ('___','_____') )
AND
( left(dst,1) = left(cod_area,1) OR left(dst,2) = left(cod_area,2) OR left(dst,3) = left(cod_area,3) )

)

Pois um valor nao poder ser 1 e(AND) 543 e(AND) 20 , ou(OR) ele é uma coisa ou(OR) é outra. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

...
(

( left(dst,2) NOT IN (55,86) AND dst NOT IN ('___','_____') )
AND
( left(dst,1) = left(cod_area,1) OR left(dst,2) = left(cod_area,2) OR left(dst,3) = left(cod_area,3) )

)

Pois um valor nao poder ser 1 e(AND) 543 e(AND) 20 , ou(OR) ele é uma coisa ou(OR) é outra. ;)

 

Opa...cara desculpe a demora, as últimas semanas foram punk. Bom consegui filtrar os valores, entanto agora estou com outro problema, o restulado me retorna outros valores que pra mim não correspondem a busca. Tipo assim:

 

Se eu tenho os códigos:

129768

134636

141235

204535

203211

207644

543215

543123

543767

 

E também os códigos:

210234

234234

545234

546342

 

Ai o que acontece, essa parte de códigos também aparece no resultado, pois começa com 2, e 5, ou seja parece que o SELECT ignora a ordem de ter somente o primeiro, segundo e terceiro, dígitos iguais, se bem que acho que isso ocorre, por causa da regra que puxa o 1º e 2º digito né?.

 

Basicamente o que quero fazer é varrer o campo "dst" e ir checando se ele bate com o campo "cod_area" e assim aplicar o valor correspondente.

 

Não sei, mas parece que isso já está sendo feito, mas os resultados não estão de acordo. Talvez seja alguma inconsistência nas minhas tabelas.

 

Existe outra forma de fazer esse SELECT?

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.