Dúvidas com Mysql

Boa tarde pessoal,

estou com uma dúvida relacionada ao mysql, eu estou tentando fazer um sistema de controle de mensalidades, o cadastro, remoção, alteração e pesquisa as tabelas no banco eu ja consegui graças a ajuda do pessoal do forum, porem resta uma dúvida, como eu poderia fazer para linkar 3 tabelas? vou explicar porque, eu tenho a tabela contatos, endereço e mensalidade, na tabela contatos estariam os dados do contato, na tabela endereço, estaria o endereço dos contatos e na tabela mensalidade eu gostaria de colocar os pagamentos, quem pagou, e a data do pagamento, assim quando eu tirar um relatorio para listar os usuarios que nao pagaram a mensalidade, buscaria os dados nas 3 tabelas, so que nao consegui ainda fazer as 3 tabelas se comunicarem, pois o contato de id 1 tem um endereco na outra tabela e se pagou ou nao na tabela mensalidade, poderiam me ajudar? sou novato em linguagem de programação e esta um pouco complicado pra mim, se possivel for, gostaria que alguem me indicasse um livro para estudos.

SDS a todos

cara, não entendi muito bem o que você disse não, fora o fato que você quer trazer valores de 3 tabelas diferentes.
Mas bem, para trazer esses valores você pode utilizar as cláusulas do mysql, por exemplo, inner join, left join, etc, sem contar que você pode pedir ao sql para te trazer os valores de todas as tabelas ao mesmo tempo, mas pra isso tem que especificar qual campo e qual tabela. Dê uma olhada nesse artigo:

http://www.luis.blog.br/left-join-e-inner-join-juncao-em-consultas-sql.aspx

ele vai te ajudar bastante, se tiver dúvidas, posta a estrutura das tabelas que eu te ajudo com as consultas.

O seu problema não é com programação, e sim com teoria de banco de dados… isso se resolve com tabelas associativas… por exemplo:

-Contato(tabela com os dados do usuario)
-Endereco (tabela com endereco)
… crie uma associativa:
-ContatoEndereco (essa tabela vai conter o ID do usuario, e o ID do endereco dele)
Nesse caso, isso vale se o Contato tiver mais de um Endereco, pois se ele tiver apenas um, basta inserir um campo IdEndereco na tabela Contatos, referenciando o Endereco…

Mesma coisa com a outra tabela… ContatoMensalidade… daí voce pode fazer um select com seus devidos Join’s e referenciando apenas o ID do usuário em questão… não se esqueça de criar as Constraints (FK - Foreign Keys) para as tabelas associativas…

Ola Andre, deixa eu tentar te explicar:

eu tenho a tabela contatos onde tem:
id
matricula <== pois preciso pesquisar pela matricula que todos ja tem
nome
sobrenome
telefone
celular
email

tenho a tabela endereco onde tem as seguintes colulas:
rua
numero
cep
complemento
bairro
estado
cidade

e teria a tabela mensalidade que controlaria quem pagou e quem nao pagou a mensalidade, ainda estou na duvida doque colocar nela, só sei que o sistema eu irei clicar em relatorio e ira trazer um relatorio de quem nao pagou a mensalidade e quantas mensalidades atrasadas sao, alem do nome e matricula que estariam na tabela contato.

oq eu gostaria de fazer com isso é, quando eu adicionar um contato, eu adicionaria nome matricula telefone(endereco rua cep) tudo em um formulario, porem os dados do jsp iriam para a tabela contatos e tabela endereco, nao sei se estou fazendo certo, pois como eu disse, eu sou iniciante bem cru, estou tentando colocar em pratica os ensinamentos do curso, porem em um outro sistema idealizado por mim para treinar. espero ter esclarecido as duvidas, aguardo respostas.

obrigado

mouzer também sou novo nesse mundo do desenvolvimento. Mas do meu ponto de vista vc não precisa dividir essa tabela de contatos, vai ficar mais trabalhoso, faça tudo numa tabela só. A não ser que você precise inserir vários endereços para um mesmo cliente/contato. Também não tenho larga experiência em desenvolvimento, então espero que outros colegas também opinem.

O ideal seria que seu id fosse a matrícula, se conseguir fazer essa migração seria bom ou mesmo jogar fora essa matricula antiga. Para q vc consiga fazer " uma tabela conversar com a outra", vc deve usar um campo que contenha a informação em comum com a outra, chama-se chave estrangeira (FK). Faça inserção de um campo na tabela de endereços.

Ficaria assim:
rua
numero
cep
complemento
bairro
estado
cidade
contato_id ===> id do contato na tabela CONTATOS

Eu usaria uma tabela LANÇAMENTOS p/ as mensalidades com um campo pra sinalizar o pagamento. Caso nao sejam cobrados juros nem nada, pode partir de algo assim:
contato_id ===> id do contato na tabela CONTATOS
datavencimento
valor
pago (s/n) =====> campo logico, quando fosse pago atualizava p/ true
datapagamento

pronto, aí é só filtrar as mensalidades que são !pago (nao pago) e ler o contato_id na tabela contatos. Agora é só dar uma boa estudada em como construir consultas SQL;

[quote=mouzer]Ola Andre, deixa eu tentar te explicar:

eu tenho a tabela contatos onde tem:
id
matricula <== pois preciso pesquisar pela matricula que todos ja tem
nome
sobrenome
telefone
celular
email

tenho a tabela endereco onde tem as seguintes colulas:
rua
numero
cep
complemento
bairro
estado
cidade

e teria a tabela mensalidade que controlaria quem pagou e quem nao pagou a mensalidade, ainda estou na duvida doque colocar nela, só sei que o sistema eu irei clicar em relatorio e ira trazer um relatorio de quem nao pagou a mensalidade e quantas mensalidades atrasadas sao, alem do nome e matricula que estariam na tabela contato.

oq eu gostaria de fazer com isso é, quando eu adicionar um contato, eu adicionaria nome matricula telefone(endereco rua cep) tudo em um formulario, porem os dados do jsp iriam para a tabela contatos e tabela endereco, nao sei se estou fazendo certo, pois como eu disse, eu sou iniciante bem cru, estou tentando colocar em pratica os ensinamentos do curso, porem em um outro sistema idealizado por mim para treinar. espero ter esclarecido as duvidas, aguardo respostas.

obrigado[/quote]

Galera, ainda não li o texto todo, mas atentem a isto:

TODOS OS USUÁRIOS TÊM:

  • Uma id;(somente uma)
  • Uma matrícula; (idem)
  • Um nome;
  • Um sobrenome;
  • Um e-mail registrado;
  • Um país;
  • Um estado;

note que essa tabela tudo é único

UM USUÁRIO PODE TER:

  • Mais de uma casa; (sou um exemplo destes – isso implica em mais de 1 endereço, que é rua, numero, cep, complemento, bairro)

Só nesta informação, já vimos que tem uma relação de “Usuário X Endereço” de 1 - n.
a base de vocês tem que receber essas informações.

suponhamos que vocês utilizem mysql, lá mesmo vocês tem que criar a relação de depenências, as FK e PK

tabela usuário:

DROP TABLE IF EXISTS demandas.usuario;
CREATE TABLE demandas.usuario (
id_usuario int(10) unsigned NOT NULL,
matricula int(10) unsigned NOT NULL,
nome varchar(45) NOT NULL,
sobrenome varchar(80) NOT NULL,
email varchar(75) NOT NULL,
pais varchar(45) DEFAULT NULL,
estado varchar(45) DEFAULT NULL,
PRIMARY KEY (id_usuario)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

tabela endereco:

DROP TABLE IF EXISTS demandas.endereco;
CREATE TABLE demandas.endereco (
id_usuario int(10) unsigned DEFAULT NULL,
rua varchar(45) DEFAULT NULL,
numero varchar(20) DEFAULT NULL,
cep int(8) unsigned DEFAULT NULL,
bairro varchar(100) DEFAULT NULL,
complemento varchar(45) DEFAULT NULL,
estado varchar(45) DEFAULT NULL,
cidade varchar(45) DEFAULT NULL,
KEY FK_IdUsuario (id_usuario),
CONSTRAINT FK_IdUsuario FOREIGN KEY (id_usuario) REFERENCES usuario (id_usuario)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

olha a FK ali linkando a casa ao usuário

**tenho que correr agora, quando chegar em casa termino o post!

Pessoal, muito obrigado mesmo pelas dicas, sério, agora eu estou tendo uma luz no fim do tunel para colocar em prática o que aprendo no curso, sei que muitas pessoas vao pensar, ah ele quer tudo de mão beijada, mas nao é, como eu disse, sou cru em programação, banco de dados, minha área é redes e manutenção, ou seja, ainda nao sei muitas fontes para procurar por códigos ou dúvidas, não sei se poderiam me ajudar nesta dúvida: após eu linkar as tabelas como o amigo andre informou, há um comando onde eu poderia listar em um DAO os dados das tabelas tudo junto? exemplo, tabela contato endereço, o endereço ficaria na tabela correspondente, teria algum comando para eu buscar o contato e seu respectivo endereco nas 2 tabelas?? abraço a todos!

mouzer, boa noite :slight_smile:

Em linha geral, vc pode começar estudando UML, que vai lhe dar uma boa visão de como desenvolver utilizando linguagens orientadas a objetos. É o que estou estudando em maior profundidade atualmente, e está me auxiliando muito.

Quanto ao banco de dados, o ideal é pegar algo apropriado ao SGDB eleito: MySQL. Além da teoria envolvida, na modelagem de banco de dados, que muitos livros de SQL dão uma visão geral - o que não dispensa a leitura de um livro totalmente voltado a modelagem de bancos.

Quanto ao comando para busca das infomações, vai depender de como ficou suas tabelas, pois pelo que li até o momento. Voce recebeu novas possibilidades de trabalhar seu banco de dados:

  • As informações divididas em duas tabelas.
  • Todas informações em uma tabela só.

As duas acima são as que recordo neste momento. No caso da primeiria opção, vc vai precisar de um “JOIN”, onde um dos primeiros links passados tem as orientações necessárias. Já no segundo caso, bastaria montar um “SELECT” com as condições necessárias.

Levando em considereção que a alteração na tabela endereço ainda não foi realizada, ou seja, vc não adicionou na tabela endereço a coluna “id”, conforme lhe orientaram de origem na tabela contato. A junção não será realizada por não haver uma coluna em comum para ser usada de referencia.

Caso o ajuste não tenha sido feito por algum problema, o mais prático é, recriar as tabelas, e gerar a chave estrangeira da coluna “id” para endereço. Para tal vc vai precisar de informações sobre SQL básico, e há muito material disponivel na internet. Procure a respeito de chave primaria e chave estrangeira.

[]s

Tem sim, da uma olhada no link que andre.froes postou. Pesquise tudo que puder sobre SQL, principalmente consultas SELECT. Vá aprendendo devagar, sem dar um passo muito grande.

Quanto ao DAO, uma das formas é usar um PreparedStatment com a consulta e interar sobre o ResultSet formando um List.

Cara vc precisa mesmo aprender SQL!!!

Nesse caso você faz um lance assim ó:

SELECT Nome Do Caboclo, (SELECT CONCAT(Rua,Cidade) FROM Endereços WHRE ID do Caboclo=Caboclos.ID) FROM Cablocos WHERE Nome do Caboclo=‘Tal da Silva’

Ou seja vc pode fazer SELECT dentro de uma Coluna de um outro SELECT chama-se isso de SubSelect mas daí vai da genialidade de cada um.

Mas o lance mesmo é vc aprender SQL para MySQL e sobre SubSelect.