s4muc4 Posted June 19, 2013 at 09:32 AM Report #513742 Posted June 19, 2013 at 09:32 AM 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 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: eu ainda sou um bocado inexperiente em php 😛 alguma sugestao?
pikax Posted June 19, 2013 at 09:40 AM Report #513744 Posted June 19, 2013 at 09:40 AM 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."
pmg Posted June 19, 2013 at 11:28 AM Report #513774 Posted June 19, 2013 at 11:28 AM (edited) 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 June 19, 2013 at 11:40 AM 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!
s4muc4 Posted June 19, 2013 at 11:44 AM Author Report #513778 Posted June 19, 2013 at 11:44 AM (edited) ok, peço desculpa, mas esquecime de dizer que a tabela que quero fazer é em php, ou seja, para mostrar numa pagina de internet 😛 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 June 19, 2013 at 09:57 PM by s4muc4
pikax Posted June 19, 2013 at 11:48 AM Report #513781 Posted June 19, 2013 at 11:48 AM 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."
s4muc4 Posted June 19, 2013 at 11:51 AM Author Report #513782 Posted June 19, 2013 at 11:51 AM 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
HappyHippyHippo Posted June 19, 2013 at 11:57 AM Report #513784 Posted June 19, 2013 at 11:57 AM 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 Portugol Plus
s4muc4 Posted June 19, 2013 at 12:13 PM Author Report #513787 Posted June 19, 2013 at 12:13 PM (edited) mas qual delas será a mais viável? Edited June 19, 2013 at 02:12 PM by s4muc4
pikax Posted June 19, 2013 at 12:56 PM Report #513792 Posted June 19, 2013 at 12:56 PM 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."
s4muc4 Posted June 19, 2013 at 09:03 PM Author Report #513923 Posted June 19, 2013 at 09:03 PM (edited) fixe mas no entanto a minha questao ainda se mantem 😛 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 June 19, 2013 at 09:04 PM by s4muc4
pikax Posted June 19, 2013 at 09:12 PM Report #513926 Posted June 19, 2013 at 09:12 PM 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."
pmg Posted June 19, 2013 at 09:16 PM Report #513928 Posted June 19, 2013 at 09:16 PM 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!
s4muc4 Posted June 19, 2013 at 09:56 PM Author Report #513941 Posted June 19, 2013 at 09:56 PM 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"
pmg Posted June 19, 2013 at 10:06 PM Report #513942 Posted June 19, 2013 at 10:06 PM 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!
s4muc4 Posted June 19, 2013 at 10:35 PM Author Report #513947 Posted June 19, 2013 at 10:35 PM 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?
pmg Posted June 20, 2013 at 09:59 AM Report #513985 Posted June 20, 2013 at 09:59 AM 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!
s4muc4 Posted June 20, 2013 at 01:42 PM Author Report #514051 Posted June 20, 2013 at 01:42 PM (edited) 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 June 20, 2013 at 01:47 PM by s4muc4
s4muc4 Posted June 24, 2013 at 09:01 AM Author Report #514658 Posted June 24, 2013 at 09:01 AM (edited) ok obrigado a todos Edited June 30, 2013 at 01:57 PM by s4muc4
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now