Jump to content


Photo

Problema Com Select


  • Faça o login para participar
8 replies to this topic

#1 Eder Cuer

Eder Cuer

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Masculino
  • Localidade:Tupã

Posted 29/03/2012, 19:07

Eae galera, acabei de me cadastrar
To com um problema que ta me deixando doido da vida, já tive ajuda de uns amigos mas nada resolveu, vou explicar:

Estou tentando fazer um filtro, mas estou me enrolando na parte do select, vou tentar explicar.

É um sistema de transportadora, onde um usuario escolhe a cidade origem e cidade destino, então o sistema deveria retornar as transportadoras que atendam a essas duas cidades.


Meu sistema tem as seguintes tabelas:

mrh                    mrh_cidade           mrh_transportadora
- cod_mrh            - fk cod_cid           - fk cod_transp    
- nome                - fk cod_mrh          - fk cod_mrh
- fk cod_estado


Fiz dois select, esse com inner join:
SELECT transportadora.cod_transp, nome
FROM mrh_transportadora
INNER JOIN transportadora ON transportadora.cod_transp = mrh_transportadora.cod_transp
INNER JOIN mrh_cidade ON mrh_cidade.cod_mrh = mrh_transportadora.cod_mrh
WHERE mrh_cidade.cod_cid
IN ( 13, 14 ) 
GROUP BY cod_transp

E esse:


SELECT t.nome, t.cod_transp
FROM transportadora t, cidade c, mrh, mrh_transportadora mt, mrh_cidade mc
WHERE c.cod_cid = mc.cod_cid
AND mrh.cod_mrh = mc.cod_mrh
AND t.cod_transp = mt.cod_transp
AND mrh.cod_mrh = mt.cod_mrh
AND c.cod_cid
IN (
'13', '14'
)


No inicio achei que tava certo, mas ta acontecendo o seguinte, vamos supor:
A transportadora A, B atendem as cidades de codigo 13,14, 15. A transportadora C atende 13, 14, 15 e 33.
Se eu faço o select com 13 e 14, me aparece todas as transportadoras.
Se eu faço o select com 15 e 33, me aparece só uma transportadora.
Mas se faço o select com 14 e 33 me aparece todas as transportadoras, mas no caso do meu filtro não deveria aparecer nenhum, porque nenhuma transportadora atende a essas duas cidades.

Galera desculpa se ta grande aqui, tentei explicar da melhor forma possivel.
Quem puder me ajudar eu agradeço.

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 29/03/2012, 22:16

Eu não entendi a estrutura do seu banco, mas vamos supor duas tabelas: transportadora (id,nome) e destinos (id,idtrans,idcidade).

Primeiro, selecione as transportadoras que atendem a origem:

SELECT t1.id,t1.nome
FROM transportadoras t1
INNER JOIN destinos d1
ON t1.id = d1.idtrans
WHERE d1.idcidade = $Origem

Daí, dentre essas que atendem a origem, selecione as que atendem ao destino:

SELECT t2.id,
t2.nome
FROM (SELECT t1.id,
t1.nome
FROM transportadoras t1
INNER JOIN destinos d1
ON t1.id = d1.idtrans
WHERE d1.idcidade = $Origem) t2
INNER JOIN destinos d2
ON d2.idtrans = t2.id
WHERE d2.idcidade = $Destino


#3 Eder Cuer

Eder Cuer

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Masculino
  • Localidade:Tupã

Posted 29/03/2012, 22:31

Eae LeoB...
O que você não entendeu?

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 29/03/2012, 23:32

Entenda o SQL e tente fazer. Se não conseguir, detalhe melhor as tabelas que você tem e os relacionamentos.

#5 Eder Cuer

Eder Cuer

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Masculino
  • Localidade:Tupã

Posted 30/03/2012, 01:12

Posted Image

Essas são as tabelas, tem outras mas acho que só essas interessam nesse caso.

Quando um usuario cadastra uma transportadora ele escolhe as microrregiões(mrh) que a transportadora atende, dentro dessas microrregiões existem varias cidades. Então se o usuario no cadastro disse que a transportadora A atende a mrh x, então essa transportadora vai atender a todas as cidades da microrregião x.

Ai vamos supor que um usuario precisa fazer um frete, ai ele escolhe a cidade origem e destino, ai o select deveria listar quais transportadoras atendem as cidades, de acordo com os codigos das cidades selecionadas.


Na tabela mrh_cidade, eu tenho as cidades que pertencem a "tal" microrregião. (cod_mrh e cod_cid)
Na tabela mrh_transportadora, eu tenho as tranportadoras que atendem a "tais" microrregiões.(cod_mrh e cod_transp)

#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 30/03/2012, 11:16

Com a lógica que passei dá pra fazer. Você tentou?

#7 Eder Cuer

Eder Cuer

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Masculino
  • Localidade:Tupã

Posted 30/03/2012, 13:08

Eu meio que me perdi.. fiz desse jeito:
SELECT transportadora.cod_transp,
       nome
FROM
  (SELECT t.cod_transp
     FROM mrh_transportadora mt
     INNER JOIN transportadora t
       ON t.cod_transp = mt.cod_transp
     INNER JOIN mrh_cidade mc
       ON mc.cod_mrh = mt.cod_mrh#
     WHERE mc.cod_cid = 33 ) mrh_transportadora mt2
  
  INNER JOIN transportadora t2
    ON t2.cod_transp = mt2.cod_transp
  INNER JOIN mrh_cidade mc2
    ON mc2.cod_mrh = mt2.cod_mrh
  WHERE mc2.cod_cid = 14

E deu esse erro:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mt2 INNER JOIN transportadora t2 ON t2.cod_transp = mt2.cod_transp IN' at line 10


Tentei fazer assim:
SELECT transportadora.cod_transp,
       nome
FROM
  (SELECT t.cod_transp
     FROM mrh_transportadora mt
     INNER JOIN transportadora t
       ON t.cod_transp = mt.cod_transp
     INNER JOIN mrh_cidade mc
       ON mc.cod_mrh = mt.cod_mrh#
     WHERE mc.cod_cid = 33 ) mrh_transportadora
  
  INNER JOIN transportadora
    ON transportadora.cod_transp = mrh_transportadora.cod_transp
  INNER JOIN mrh_cidade
    ON mrh_cidade.cod_mrh = mrh_transportadora.cod_mrh
  WHERE mrh_cidade.cod_cid = 14

E deu esse erro:
#1054 - Unknown column 'mrh_transportadora.cod_mrh' in 'on clause'


#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 30/03/2012, 22:16

Tente assim:

SELECT t2.cod_transp,
t2.nome
FROM (SELECT t1.cod_transp,
t1.nome
FROM transportadora t1
INNER JOIN mrh_transportadora mt1
ON mt1.cod_transp = t1.cod_transp
INNER JOIN mrh_cidade mc1
ON mc1.cod_mrh = mt1.cod_mrh
WHERE mc1.cod_cid = $Origem) t2
INNER JOIN mrh_transportadora mt2
ON mt2.cod_transp = t2.cod_transp
INNER JOIN mrh_cidade mc2
ON mc2.cod_mrh = mt2.cod_mrh
WHERE mc2.cod_cid = $Destino


#9 Eder Cuer

Eder Cuer

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Masculino
  • Localidade:Tupã

Posted 03/04/2012, 10:39

Salve LeoB...
Cara não sei nem como agradecer, funcionou agora, não sabia que dava pra fazer select dentro de select, muito legal.

Obrigado ae pela paciencia e pela ajuda, de verdade mesmo.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq