Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite pessoal, ultimamente venho estudando mais as instruções SQL e estou tentando cada vez mais otimizar meus sistemas usando alguns recursos do proprio banco de dados, e venho a todos pedir uma orientação em uma questão que não sei se é possível ou não, abaixo vou ilustrar o meu problema:
usuario
Campos: *id_usuario** | nome_usuario | senha_usuario*
usuario_contato
Campos: *id_contato | fk_id_usuario** | descricao_contato*
Como podem ver, eu tenho uma chave estrangeira na tabela usuario_contato relacionando com a tabela usuário. Até este ponto sem problema, ok ?
O x da questão vem agora, como eu faço para fazer uma consulta buscando agrupando as 2 consultas sabendo que:
Teoricamente a forma da consulta seria assim:
SELECT u.*, c.* FROM usuario AS u
JOIN usuario_contato AS c
ON c.fk_id_usuario = u.id_usuario
WHERE u.id_usuario = 5
Mas se o usuário de id 5 não inseriu nenhuma informação de contato a FK da tabela contato estará vazia e com isso a consulta não ira retornar nada certo ?
Atualmente eu tenho que fazer 3 consultas para resolver isso, primeiro faço uma consulta na tabela de usuario:
SELECT * FROM usuario WHERE id_usuario = 5
Depois faço uma verificação na tabela contato_usuario para ver se existe algum registro pertinente ao usuário
qtd = SELECT COUNT(*) FROM usuario_contato WHERE fk_id_usuario = 1
// verifico se existe os dados, então faço uma consulta para armazenar os dados
if ( qtd > 0 )
contato = SELECT * FROM usuario_contato WHERE fk_id_usuario = 1
Alguém poderia me ajudar ? O que eu pensei em fazer é algo parecido com isso:
SELECT u.*, c.* FROM usuario AS u
IF c.fk_id_usuario != NULL faca {
JOIN usuario_contato AS c
ON c.fk_id_usuario = u.id_usuario
}
WHERE u.id_usuario = 5
Ps.: no contexto do meu projeto, a tabela usuario_contato só vai poder armazenar 1 unico registro, ou seja, eu posso trazer ele junto com join pois vai ter apenas 1 linha.
Olá Motta,
Obrigado por me ajudar, realmente usando o LEFT deu certo, mas agora fiquei com uma pequena dúvida, o LEFT e o RIGHT fazem o mesmo papel certo?
E o INNER JOIN e JOIN, trazem os dados restritamente como pedem a consulta ?
obrigado e até mais
aparentemente sim.
não é um IF, mas funciona como tal e é mais rapido.
lembro que usei muito uma sintaxe similiar em vb6/SQLSERVER, e que também é usada em oracle.
então foi só buscar no google
só depende de como você vai usar, pq precisa das constantes para comparar (no exemplo 'one', 'two' e 'more')
no link abaixo tbm mostra uso de if, mas "case when" é muito mais rapido.
http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
-> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
-> 'true'
mysql> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
-> NULLClaro que tem como fazer IF, não só IF, como toda estrutura if / elseif / else ..
mysql> select if( 'a' = 'a', 'a é igual', 'Não é igual' );
+---------------------------------------------+
| if( 'a' = 'a', 'a é igual', 'Não é igual' ) |
+---------------------------------------------+
| a é igual |
+---------------------------------------------+
1 row in set (0.00 sec)
Já o else/elseif só em procedure.
Hum, entendi, obrigado Andrey, Motta e barogana.
Eu resolvi usando o LEFT JOIN mesmo, porque precisava juntar uma tabela, eu achei que os if() poderia inserir dps do from, mas é so nos campos :P
obrigado e até mais :thumbsup:
Sim, é só nos campos .. alias, no que tem haver com retorno do SQL, da mesma forma que você pode atribuir variáveis ao retorno, você pode trabalhar nelas no contexto do sql.
Tente usar outer join.