FluxBB.fr

Le site des utilisateurs francophones de FluxBB.

Vous n'êtes pas identifié(e).

#1 13-02-2013 19:54:46

Spiky
Membre
Inscription : 10-04-2008
Messages : 829

[Résolu] Besoin d'aide pour requête SQL

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&amp;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&amp;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

#2 13-02-2013 20:02:11

Cr@sh_
Membre
Inscription : 02-09-2011
Messages : 85
Site Web

Re : [Résolu] Besoin d'aide pour requête SQL

Bonsoir,

En essayant une auto-jointure sur la table Tag ça ne te donne rien ?


Administrateur et fondateur de Geek-Community

Hors ligne

#3 13-02-2013 20:08:11

Spiky
Membre
Inscription : 10-04-2008
Messages : 829

Re : [Résolu] Besoin d'aide pour requête SQL

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. tongue

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

#4 13-02-2013 20:23:20

Cr@sh_
Membre
Inscription : 02-09-2011
Messages : 85
Site Web

Re : [Résolu] Besoin d'aide pour requête SQL

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! smile

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! smile


Administrateur et fondateur de Geek-Community

Hors ligne

#5 14-02-2013 00:16:17

PascL
Membre
Inscription : 06-09-2007
Messages : 554
Site Web

Re : [Résolu] Besoin d'aide pour requête SQL

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

Hors ligne

#6 14-02-2013 13:25:53

Spiky
Membre
Inscription : 10-04-2008
Messages : 829

Re : [Résolu] Besoin d'aide pour requête SQL

Bonjour,

PascL a écrit :

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.

PascL a écrit :

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 wink

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

Pied de page des forums