Jump to content
s4muc4

table filling com recurso a 3 tabelas

Recommended Posts

s4muc4

boas

tenho andado a realizar um site em php com ligaçao a uma base de dados e tenho andado com algumas dificuldades a fazer table filling com dados da base de dados.

o problema é que tenho duas tabelas com uma uma tabela de ligacao que ficam assim

1006140_477208315697832_1127413422_n.jpg

registos das tabelas

- r_reg_actividade (acampamento, acantonamento)

- condicao (actividade escuteira, atividade nao escuteira)

num breve resumo, a tabela reg_act_cond define o preco da atividade descrita na tabela r_reg_actividade em funçao da condição descrita na tabela condicao.

o que eu pretendo é fazer o preenchimento de uma tabela com os dados dessas tres tabelas, tipo assim:

970547_477209855697678_350636557_n.jpg

eu ainda sou um bocado inexperiente em php :P alguma sugestao?

Share this post


Link to post
Share on other sites
pikax

Basta inserires os ID na reg_act_cond, qual e' a dificuldade?


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
pmg

Segundo penso, a melhor solução (para tabelas com colunas diversas) passa por fazeres 3 selects, um a cada tabela, e misturares tudo em PHP.

Se pretendes uma solução SQL básica (em MySQL), que pode não funcionar em alguns casos, experimenta "GROUP_CONCAT", tal como em http://www.artfulsoftware.com/infotree/qrytip.php?id=78

mysql> create table activity (act int primary key not null, tipo varchar(100));
Query OK, 0 rows affected (0.26 sec)

mysql> create table condicao (cond int primary key not null, tipo varchar(100));
Query OK, 0 rows affected (0.12 sec)

mysql> create table ac (act int not null, cond int not null, preco double);
Query OK, 0 rows affected (0.14 sec)

mysql> insert activity values (1, 'escutista'), (2, 'nao escutista');
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert condicao values (1, 'Acampamento'), (2, 'acantonamento');
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert ac values (1, 1, 0.5), (1, 2, 1), (2, 1, 1), (2, 2, 2.5);
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select condicao.tipo, group_concat(if(ac.act=1, ac.preco, null)) as a1,
group_concat(if(ac.act=2, ac.preco, null)) as a2 from condicao, activity, ac where
condicao.cond=ac.cond and activity.act=ac.act group by condicao.tipo;
+---------------+------+------+
| tipo          | a1   | a2   |
+---------------+------+------+
| Acampamento   | 0.5  | 1    |
| acantonamento | 1    | 2.5  |
+---------------+------+------+
2 rows in set (0.00 sec)

mysql> drop table activity;
Query OK, 0 rows affected (0.07 sec)

mysql> drop table condicao;
Query OK, 0 rows affected (0.08 sec)

mysql> drop table ac;
Query OK, 0 rows affected (0.05 sec)

Edited by pmg
exemplo

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
s4muc4

ok, peço desculpa, mas esquecime de dizer que a tabela que quero fazer é em php, ou seja, para mostrar numa pagina de internet :P

até agora só consegui fazer algo do género:

<?php
 $qreg = mysql_query("
    select distinct tipo, condicao, preco
    from r_reg_actividade, condicao, reg_act_cond
    where r_reg_actividade.id_reg_act = reg_act_cond.id_reg_act
     and condicao.id_condicao = reg_act_cond.id_condicao
   ") or die(mysql_error());

 if($qreg)
 {
   echo "<table>
           <tr>
             <th>Por Pessoa/Noite</th>
             <th>Actividades Escutistas</th>
             <th>Actividades Não Escutistas</th>
           </tr>";
   while($a = mysql_fetch_array($qreg))
   {
     echo "<tr>
             <td>". $a['condicaotipo'] ."</td>";
     if($a['id_condicao'] = 1)
     {
       echo "<td>". $a['preco'] ."</td>";
     }
     else
     {
       echo "<td>". $a['preco'] ."</td>";
     }
     echo "</tr>";
   }
   echo "</table>";
 }
?>

mas não está a funcionar como eu quero

Edited by s4muc4

Share this post


Link to post
Share on other sites
pikax

sera algo assim que queres?

SELECT * FROM reg_act_cond rac
LEFT JOIN r_reg_actividade rra ON rra.id_reg_act = rac.id_reg_act
LEFT JOIN condicao c ON c.id_condicao = rac.id_condicao


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
s4muc4

sera algo assim que queres?

SELECT * FROM reg_act_cond rac
LEFT JOIN r_reg_actividade rra ON rra.id_reg_act = rac.id_reg_act
LEFT JOIN condicao c ON c.id_condicao = rac.id_condicao

eu so sei fazer querys com varias tabelas com o where.

como não sei trabalhar com join, não te sei dizer se essa solução é ou não mais viável que a minha

Share this post


Link to post
Share on other sites
HappyHippyHippo

SELECT *
 FROM reg_act_cond rac LEFT JOIN r_reg_actividade rra ON rra.id_reg_act = rac.id_reg_act
                       LEFT JOIN condicao c ON c.id_condicao = rac.id_condicao

é igual a

SELECT *
 FROM reg_act_cond rac,
      r_reg_actividade,
      condicao c
WHERE (rac.id_reg_act = rra.id_reg_act OR rac.id_reg_act IS NULL)
  AND (rac.id_condicao = c.id_condicao OR rac.id_condicao Is NULL)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
s4muc4

mas qual delas será a mais viável?

Edited by s4muc4

Share this post


Link to post
Share on other sites
pikax

Usa o LEFT JOIN!

Com o LeFt join e' mais facil de perceber e da' mais jeito a escrever... em termos de performance, depende de como o SQL interpete.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
s4muc4

fixe

mas no entanto a minha questao ainda se mantem :P

como é que eu consigo preencher uma tabela em php com os dados das tabelas tal como está na segunda imagem que eu meti la em cima...

Edited by s4muc4

Share this post


Link to post
Share on other sites
pikax

como e' que estas a preencher agr?


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
pmg

como é que eu consigo preencher uma tabela em php com os dados das tabelas tal como está na segunda imagem que eu meti la em cima...

com o select apropriado, por exemplo, o que eu pus la em cima ...

select condicao.tipo,
      group_concat(if(ac.act = 1, ac.preco, null)) as 'Actividades Escutistas',
      group_concat(if(ac.act = 2, ac.preco, null)) as 'Actividades Nao Escutistas'
from condicao, activity, ac
where condicao.cond = ac.cond and activity.act = ac.act
group by condicao.tipo;


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
s4muc4

podes

com o select apropriado, por exemplo, o que eu pus la em cima ...

select condicao.tipo,
      group_concat(if(ac.act = 1, ac.preco, null)) as 'Actividades Escutistas',
      group_concat(if(ac.act = 2, ac.preco, null)) as 'Actividades Nao Escutistas'
from condicao, activity, ac
where condicao.cond = ac.cond and activity.act = ac.act
group by condicao.tipo;

podes explicar isso melhor? e que é a primeira vez que vejo o comando "group_concat"

Share this post


Link to post
Share on other sites
pmg

O group_concat é uma funcao especifica do MySQL

http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_group-concat

Outros sistemas tem outras funcoes para fazer o mesmo ou parecido (ou nao tem maneira de o fazer).

A melhor maneira de perceber o que ele faz é com experiencias ... a leitura do manual nao basta :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
s4muc4

ok, entao a query fica assim certo?

<?php
 $qreg = mysql_query("
   SELECT condicao.tipo,
      group_concat(IF(reg_act_cond.id_reg_act = 1, reg_act_cond.preco, NULL)) AS 'Actividades Escutistas',
      group_concat(IF(reg_act_cond.id_reg_act = 2, reg_act_cond.preco, NULL)) AS 'Actividades Nao Escutistas'
   FROM condicao, r_reg_actividade, reg_act_cond
   WHERE condicao.id_condicao = reg_act_cond.id_condicao AND r_reg_actividade.id_reg_act = reg_act_cond.id_reg_act
   GROUP BY condicao.id_condicao
 ") or die(mysql_error());

entao eu agora tenho de usar a funçao group_concat para preencher a tabela? e se sim como? tenho de chamar a funçao na celula que eu quero meter o preco?

Share this post


Link to post
Share on other sites
pmg

Suponho que o teu problema de MySQL está resolvido.

Agora tens um problema de PHP, certo?

Se sim, sugiro que abras um novo tópico no quadro de PHP (possivelmente indicando este tópico).

Mas atenção: a minha "solução" MySQL 'falha' mal adiciones uma actividade diferente, pr exemplo "Actividades com Deficientes". Ao adicionares uma actividade tens que mudar o SELECT.

Não é possível fazeres um SELECT que devolva as informações todas independentemente do conteúdo das tabelas de uma forma que o PHP possa usar directamente. Para isso aconselho-te, outra vez, que selecciones tudo das 3 tabelas em 3 SELECTs diferentes e mistures tudo com PHP (pergunta no quadro apropriado se necessário).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
s4muc4

pois, mas isso não vai acontecer porque essa tabela é mesmo só de resource e nunca irá ser modificada

acho que consigo desenrascar me com mais do que uma query,

o que eu queria mesmo éra ser preguiçoso e tentar fazer só com uma query xD

Edited by s4muc4

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.