Le site des utilisateurs francophones de FluxBB.
Vous n'êtes pas identifié(e).
Bonsoir,
J'aimerai savoir si il est possible de faire appel une seul fois à la table joint "tag" et comment :
(ce que j'ai fait en faite c'est qu'avant j'avais deux tables qui avait la même fonction, j'ai donc décidé de réunir ça en une seule)
$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, t.first_post_id, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed, tc.id as t_tag_id, tc.tag_name, tc2.id as t_tag2_id, tc2.tag_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'topic_subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') LEFT JOIN '.$db->prefix.'tag AS tc ON t.tag_id=tc.id LEFT JOIN '.$db->prefix.'tag AS tc2 ON t.tag2_id=tc2.id WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());Deuxième problème :
Quand je veux afficher le résultat, j'ai bien mes deux liens avec le bon id pour chacun (donc ok) MAIS le nom retourné est le même au deux liens au lieu d'avoir le nom associé à l'id de la table Tag.
Mon appel :
<?php if(!isset($tag_printed)): ?>
<div class="tag">
<?php if(!empty($cur_topic['tag_name'])): ?><span><a href="<?php echo 'search.php?action=show_tag&t_tag_id='.$cur_topic['t_tag_id'] ?>"><?php echo pun_htmlspecialchars($cur_topic['tag_name']) ?></a></span><?php endif; ?> <?php if(!empty($cur_topic['tag_name'])): ?><span><a href="<?php echo 'search.php?action=show_tag2&t_tag2_id='.$cur_topic['t_tag2_id'] ?>"><?php echo pun_htmlspecialchars($cur_topic['tag_name']) ?></a></span>
<?php endif; ?>
</div>
<?php $tag_printed = true; endif; ?>P.S: ma table Tag contient deux colonnes : "id" et "tag_name"
rajout dans la table topics de deux colonnes : "tag_id" et "tag2_id"
Si une âme charitable veut bien m'aiguiller...
Dernière modification par Spiky (13-02-2013 20:05:12)
I don't play against a team in particular. I play to fight against the idea to lose... Life is beautiful.
Quelque #ID et beaucoup de .CLASS
Hors ligne
Bonsoir,
En essayant une auto-jointure sur la table Tag ça ne te donne rien ?
Administrateur et fondateur de Geek-Community
Hors ligne
Bonsoir Cr@sh,
En faite ma requête fonctionne, mais je pense que l'on peut éviter l'appelle deux fois. Et moi et les jointures cela fait deux. 
C'est plus le deuxième problème qui me gène. (qui au passage est peut être due à la requête !)
I don't play against a team in particular. I play to fight against the idea to lose... Life is beautiful.
Quelque #ID et beaucoup de .CLASS
Hors ligne
Une auto-jointure s'écrit comme ceci:
SELECT a.nom, a.adresse
FROM pilote a, pilote b
WHERE a.adresse = b.adresse
ORDER BY 1,2 ; C'est un exemple que j'ai retrouvé dans mes cours de SQL pour l'auto-jointure, je ne sais pas si cela peut t'aider, mais je pense que ton problème vient bien de la requête! 
Dans ton cas ça serait plus:
SELECT * FROM tag ta1, tag ta2
WHERE ta1.id = ta2.id;
* Pense bien a préciser ce que tu veux récupérer en préfixant les champs avec ta1 ou ta2. En espérant t'aider! 
Administrateur et fondateur de Geek-Community
Hors ligne
Salut,
Pour la 1° question:
En ce qui concerne la requête, je vois pas mieux que les 2 jointures (mais c'est pas ma spécialité non plus).
Par contre, il y a une autre solution possible. Puisque tu fais tes jointures seulement pour récupérer un seul champ, il vaut peut-être mieux faire un fichier cache de tes tags (prendre exemple sur la fonction qui génère $cache_config).
Pour la 2° question:
Dans la requête, faut renommer simplement le 2° champ avec un AS: tc2.tag_name AS tag2_name
Bouh !
StarShip Renaissance
Hors ligne
Bonjour,
Salut,
Pour la 1° question:
En ce qui concerne la requête, je vois pas mieux que les 2 jointures (mais c'est pas ma spécialité non plus).
Moi non plus d'où mon interrogation donc la question reste ouverte, si un spécialiste sql se manifeste.
Par contre, il y a une autre solution possible. Puisque tu fais tes jointures seulement pour récupérer un seul champ, il vaut peut-être mieux faire un fichier cache de tes tags (prendre exemple sur la fonction qui génère $cache_config).
Bonne idée, je vais jeter un oeil à ce que tu m'as mis et voir si je peux me dépatouiller.
Pour la 2° question:
Dans la requête, faut renommer simplement le 2° champ avec un AS: tc2.tag_name AS tag2_name
Effectivement avec un alias cela va beaucoup mieux. It's ok now 
Merci a vous deux de vous être penché sur ma demande.
P.S: Je laisse en non résolu pour le moment, suite au point 1. Une optimisation est toujours la bienvenue.
Dernière modification par Spiky (14-02-2013 13:34:50)
I don't play against a team in particular. I play to fight against the idea to lose... Life is beautiful.
Quelque #ID et beaucoup de .CLASS
Hors ligne