Nuage de tag en php/mysql - PHP - Programmation
Marsh Posté le 22-10-2007 à 16:29:16
Je vois pas ce que tu attends de nous, là.
Si tu as des lacunes, lis la doc et essaye des choses.
Marsh Posté le 22-10-2007 à 16:36:23
skeye a écrit : Je vois pas ce que tu attends de nous, là. |
En faite, j'attend de vous que vous m'aidiez à modifier ce script pour prendre en compte tous les champs "tag".
J'attend votre aide quoi...
Encore merci d'avance.
Chris
Marsh Posté le 22-10-2007 à 16:38:48
On ne le fera pas à ta place.
Commence, si tu bloques sur un point précis pose ta question.
Marsh Posté le 22-10-2007 à 16:41:47
t'as structure de table est moldave, ça va pas être facile
Tu as une liason n-n entre tes tags et "tatable" ( un tag peut être présent 1 à N fois dans "tatable", un enregistrement de "tatable" contient 1 à N tags), tu devrais avoir trois tables "tags" "tatable" et une table de liaison entre elles.
Donc là t'as plus qu'à faire 8 requêtes ( une par tag1...tag8) et te débrouiller pour réunir tout ça ( sachant qu'un résultat de tag1 peut également être dans tag4 par exemple).
Marsh Posté le 22-10-2007 à 17:29:13
anapajari a écrit : t'as structure de table est moldave, ça va pas être facile |
Tout d'abord merci pour ton aide.
Je ne vois pas l'utilité d'une table de liaison ? Pourquoi pas un lien direct "matable" vers la table "tags" qui contiendrait (tag1, tag 2,...).
Mais je me pose aussi la question de savoir si une simple requete comme en dessous ne suffirait pas :
$result = mysql_db_query($sql_bdd,"SELECT tag, tag2, tag3, tag4, tag5, tag6, tag7, tag8, count(*) as number FROM matable GROUP BY tag, tag2, tag3, tag4, tag5, tag6, tag7, tag8" ) or die(mysql_error());
Mais ma grande question étant comme tu le dit de réunir tout ça. J'ai essayer de mettre tout ca dans un tableau, mais je mis perd.
Encore merci.
Chris
Marsh Posté le 22-10-2007 à 17:37:22
chrisgo_fr a écrit : Je ne vois pas l'utilité d'une table de liaison ? Pourquoi pas un lien direct "matable" vers la table "tags" qui contiendrait (tag1, tag 2,...). |
http://fr.wikipedia.org/wiki/Base_ [...] ationnelle
chrisgo_fr a écrit : |
Non ... et tu n'auras pas la moindre idée du pourquoi avant d'avoir compris comment fonctionnent les fonctions d'aggrégation ( genre count).
chrisgo_fr a écrit : |
C'est ballot
Marsh Posté le 22-10-2007 à 18:00:06
Je suis bien d'accord avec tout ca, mais pourquoi une table liaison ? je m'explique :
Je vois bien un lien matable-tabletag mais pas matable-tableliaison-tabletag. On imagine matable à un champs numerointernetag qui pointe sur l'enregistrement de la tabletag qui contient ce numéro interne. Pourquoi mettre une table entre les deux ?
Quand tu as une table commande par exemple et une table lignecommande. tu n'a pas de table intermédiare qui lie les deux, elles sont directement lié. Non ?
anapajari a écrit : |
Bon d'accord je créé une table tag, voir même une table de liaison, si tu insite. Mais, là n'est pas le problème. Mon problème est de réunir tout sa dans un tableau et de travailler avec. Je sait le faire avec d'autre languages, mais pas en PHP. Je fait un array de $result puis après ?
help
Merci
Marsh Posté le 22-10-2007 à 18:20:20
chrisgo_fr a écrit : |
Non
Tu as une table commande, une table produit et une table de liaison commande/produit ( que tu peux appeler ligne commande si tu veux).
Le but étant d'éviter d'avoir des informations relatives au produit ( genre son nom) dans ta table "lignecommande".
Ce qui te permet également de faire plus facilement des requêtes sur tes produits.
Marsh Posté le 22-10-2007 à 18:54:22
anapajari a écrit : |
Je suis d'accord, il y a la table produit et la table ligne commande lie les deux.
Je suis près a revoir m'a structure, il n'y a pas de problème.
Mais alors comment feriez vous pour réunir tout ca ?
Encore merci d'avance.
Marsh Posté le 22-10-2007 à 20:49:37
Et il se passe quoi le jour où tu veux autoriser un 9ème tag ?
Marsh Posté le 22-10-2007 à 21:31:24
Dj YeLL a écrit : Et il se passe quoi le jour où tu veux autoriser un 9ème tag ? |
Bah on rajoute un champ, comme les 7 premières fois
Marsh Posté le 22-10-2007 à 21:52:19
[smiley-arthur-avec-la-main-sur-le-visage]
Marsh Posté le 22-10-2007 à 22:28:56
naceroth a écrit : |
Je suis tout a fait d'accord avec vous, on ne doit pas faire ce que j'ai fait. j'en rigole d'ailleur car je n'ai pas l'habitude de faire ca.
Mais en php je suis nul(et en base de donnée ) et je vous demande votre aide.
En gros, je veux faire un nuage de tag sur une base de recettes culinaires. Des tags comme poivron, périgord, salade... Avec comme condition qu'un enregistrement soit lié à plusieurs tags.
Pouvez vous m'aider ?
Marsh Posté le 22-10-2007 à 22:45:08
1 table "tag", avec un champ id et un champ tag (perso je n'ai pas de champ id, le champ tag faisant office d'index)
1 table avec tes recettes (qui doivent chacune avoir un ID)
1 table de liaison avec un "tag_id" et un "recette_id"
Exemple :
RECETTES :
1 - Pizza jambon fromage
TAGS :
1 - olives
2 - saucisson
3 - lait
4 - jambon
5 - yaourt
6 - fromage
TAGS_RECETTES :
1 - 1
1 - 4
1 - 6
Edit : Pour ton nuage, tu compte le nombre de fois que chaque tag est utilisé. Plus il l'est, plus il est "important"
Marsh Posté le 22-10-2007 à 22:48:43
anapajari l'a déjà fait, tu crées une table tags avec deux champs (un identifiant unique et la valeur du tag) et une table de liaison pour passer d'une structure (moi je suis nul en cuisine )
Citation : |
à
Citation : |
Donc, une ligne par tag, ta table de liaison contenant autant de lignes pour une recette qu'il n'y a de tags pour la recette (8 tags pour la recette 1 => 8 lignes) avec l'id de la recette et l'id du tag. Tu n'auras plus à te soucier de savoir si la valeur que tu cherches est dans tag1 ou dans tag9654
Marsh Posté le 22-10-2007 à 23:14:34
Je n'ai qu'un mot a vous dire : MERCI !!!!!!!!!!!
Je vais travailler en suivant vos instructions. Je me permettrai de vous demander votre aide en cas de blocage . Et je mettrai le résultat de mon (votre :-) ) travail pour en faire profiter tout le monde.
Encore MERCI !!!!!!!!!
Chris
Marsh Posté le 24-10-2007 à 16:53:10
Bonjour,
Bon je suis bloqué .
J'ai fait ce que vous m'avez dit et dans un premier temps, cela marche bien.
J'ai une page ou j'ai toutes mes recettes affichées dans une liste (sur plusieurs pages) et un nuage de tag correspondant à toutes mes recettes. Lorsque je clique sur un lien du nuage, je diminu la selection pour n'afficher que les recettes qui contiennent ce tag. Jusque là pas de problème.
Ensuite j'aimerais afficher un autre nuage qui recherche uniquement les tags de la selection de recette.
en gros j'ai un $recette=mysql($sql_bdd,"SELECT.....)
Et j'aimerais faire
$result = mysql_db_query($sql_bdd,"SELECT tag, count(*) as number FROM MA SELECTION DE $RECETTE GROUP BY tag" ) .
Merci d'avance
Marsh Posté le 24-10-2007 à 18:02:40
Tu veux sélectionner uniquement la liste des tags présent dans le résultat du 1er filtrage ?
Tu récupères la liste des ID des recettes restant après le filtrage, et tu fais un truc du genre (de tête, c'est peut être faux... ) :
Code :
|
Marsh Posté le 24-10-2007 à 18:37:03
Dj YeLL a écrit : Tu veux sélectionner uniquement la liste des tags présent dans le résultat du 1er filtrage ?
|
D'abord merci, mais je ne comprend pas tout dans ta requête. Peux m'éclairer ?
t et rt c'est quoi ? Et comment tu recupère liste_des_id (c'est $result ?) ?
Encore merci d'avance
Marsh Posté le 24-10-2007 à 18:42:10
chrisgo_fr a écrit : D'abord merci, mais je ne comprend pas tout dans ta requête. Peux m'éclairer ? t et rt c'est quoi ? Et comment tu recupère liste_des_id (c'est $result ?) ? Encore merci d'avance |
t et rt sont des alias.
Si tu fais une recherche dans plusieurs tables et que les noms de tables sont super long, tu peux leur donner un alias.
Au lieu de ça :
Code :
|
Tu as ça :
Code :
|
Le "AS" est par ailleurs facultatif, tu peux faire
Code :
|
Edit : Pour les ID, tu as dis que tu avais une liste de recettes après filtrage, je suppose que tu as donc leur id non ?
Marsh Posté le 25-10-2007 à 09:00:13
Dj YeLL a écrit :
|
S'trop tout pas bo
Si le principe de la requête est bon, l'utilisation de IN est à bannir dès que possible et surtout l'utilisation de IN dans une condition de jointure c'est à chier
Alors biensur niveau optimisation, la plupart des SGBD doivent s'en sortir correctement mais il est beaucoup plus "clair" de mettre cette condition dans le where:
Code :
|
Marsh Posté le 25-10-2007 à 10:12:58
anapajari a écrit :
|
Ouaip, à dire vrai je vois même pas pourquoi je l'ai foutu dans le ON, alors que j'essaye toujours de foutre le pus possible dans le WHERE ... m'enfin, forum, réponse rapide, pas dans le contexte, juste pour aider toussa
Edit :
[EXCUSE-A-2-BALLES]
Puis je vais pas faire tout le boulot à sa place non plus, c'était juste pour le mettre sur la voie, j'ai fais exprès pour voir s'il suivait
[/EXCUSE-A-2-BALLES]
Marsh Posté le 25-10-2007 à 11:10:01
Bonjour,
Merci pour votre aide.
J'ai essayé de faire ce que vous m'avez dit mais cela ne fonctionne pas, je n'ai peux être pas la bonne syntaxe.
Voici m'a requête, je n'ai pas pris les alias car vous venez de me les apprendre et pour que ce soit plus clair dans ma tête pour le moment. je les mettrais par la suite.
$result = mysql_db_query($sql_bdd,"SELECT tag, FROM tags INNER JOIN recettes ON recettes.noint = tags.recette_noint WHERE recettes.noint IN (SELECT * FROM recettes INNER JOIN tags ON recettes.noint = tags.recette_noint where tags.tag=\"$retag\" )" ) or die(mysql_error());
Encore merci pour votre aide.
Marsh Posté le 25-10-2007 à 11:19:37
Première chose: pas de virgule entre ton tag et FROM, sinon ça peut pas marcher.
Ensuite, est-ce que tu pourrais nous dire ce que tu cherches exactement à obtenir en français?
De ce que je comprends de ta tentative de requête, tu cherches tous les tags présents dans toutes les recettes qui contiennent un tag passé en paramètre?
Si c'est bien cela, j'aurais plutot tendance à écrire la requête ainsi
Code :
|
Il est a noté que cela remontra également le tag que tu passes en paramètre, si tu souhaites éviter cela, change
Code :
|
en
Code :
|
Marsh Posté le 25-10-2007 à 11:36:54
Super ca marche ! MERCI !!!!!
Je vous remercie enormément, vous m'avez appris beaucoup de choses.
Pour mon premier post sur un forum, je ne suis pas déçu.
Encore une petit question afin de bien comprendre : tparam et tall cela correspondes à quoi ?
Chris
Marsh Posté le 25-10-2007 à 11:41:52
chrisgo_fr a écrit :
Je vous remercie enormément, vous m'avez appris beaucoup de choses. Pour mon premier post sur un forum, je ne suis pas déçu.
Encore une petit question afin de bien comprendre : tparam et tall cela correspondes à quoi ? Chris |
Les alias mon cher ... les alias
Edit : Si je peux me permettre ... pourquoi "noint" ?
Marsh Posté le 25-10-2007 à 12:03:00
Dj YeLL a écrit : |
Pour moi noint = numéro interne (ID)
Ce que je comprend pas avec les alias, c'est que je n'ai pas l'impression que l'on note quelque part que t'elle table à tel alias et ca me déroute. Je vais potasser le sujet.
Encore merci
Marsh Posté le 25-10-2007 à 12:05:30
chrisgo_fr a écrit : |
1> Pourquoi ne pas l'appeler simplement "id" ? (enfin peu importe ... je trouve juste ça "étrange" noint )
2> Ben si :
INNER JOIN tags tall ON tall.recette_noint = recettes.noint
Tu donnes l'alias "tall" à la table "tags"
Comme je le disais plus haut, on peut aussi l'écrire :
INNER JOIN tags AS tall ON tall.recette_noint = recettes.noint
AS signifiant en gros "en tant que"
Marsh Posté le 25-10-2007 à 12:08:07
un petit complément sur l'explication de Dj Yell:
Dans le cas de la requête que j'ai filé plus haut tu utilises 2 fois la table tags.
Il est donc nécessaire de leur donner un "petit nom" pour savoir que le sgbd sache sur laquelle il doit aller lire tel champ.
Marsh Posté le 25-10-2007 à 14:05:11
Juste une dernière chose, pour que je puisse afficher une taille différentes selon la fréquence du tag, il me faut un count(*) as number dans la requête et je n'arrive pas à le placer correctement. Puis-je abusé de votre gentillesse ?
Marsh Posté le 25-10-2007 à 14:30:13
Si je dis pas de connerie, il faut dans ce cas virer le "DISTINCT" sur la sélection des tag, et faire un GROUP BY à la place
Un truc du genre :
Code :
|
Mais si un plus pro que moi pouvait donner sa version
Marsh Posté le 25-10-2007 à 15:29:33
Dj YeLL a écrit : Si je dis pas de connerie, il faut dans ce cas virer le "DISTINCT" sur la sélection des tag, et faire un GROUP BY à la place
|
Merci bien, sa fonctionne bien. J'ai juste rajouté "as number" après COUNT(tall.tag)
Encore Merci !!!
Marsh Posté le 22-10-2007 à 15:28:15
Bonjour,
J’ai une table qui contient 8 champs tags (tag ,tag2, tag3, …). Et j’aimerai faire une nuage de tags qui reprend l’ensemble des tags de la base.
J’ai commencé à utiliser ce code que l’on retrouve un peux partout sur internet :
define("MIN_SIZE", 9);
define("MAX_SIZE", 36);
$result = mysql_db_query($sql_bdd,"SELECT tag, count(*) as number FROM matable GROUP BY tag ORDER BY tag" ) or die(mysql_error());
$min = MAX_INT;
$max = -MAX_INT;
while ($tag = mysql_fetch_assoc($result)) {
if ($tag['number'] < $min) $min = $tag['number'];
if ($tag['number'] > $max) $max = $tag['number'];
$tags[] = $tag;
}
$min_size = MIN_SIZE;
$max_size = MAX_SIZE;
foreach ($tags as $tag) {
$tag['size'] = intval($min_size + (($tag['number'] - $min) * (($max_size - $min_size) / ($max - $min))));
$tags_extended[] = $tag;
}
Et pour l'affichage :
<?php foreach ($tags_extended as $tag) : ?>
<a href="recherchemusiqueshdtag2.php5?type=tag2&retag=<?php echo $tag['tag']; ?>" style="font-size:<?php echo $tag['size']; ?>px" title="<?php echo $tag['tag']; ?>"><?php echo $tag['tag']; ?></a>
<?php endforeach; ?>
Cela fonctionne bien mais uniquement pour un champ tag. Et j’aimerais avoir la même chose mais sur plusieurs champs tags(tag,tag2, tag3,...).
J’ai bien tenté de modifier le code en faisant « select tag , tag1 …». Mais après mes connaissances en php ne me permettent pas de faire ce que je veux. J’imagine qu’il faut tout mettre dans un tableau puis de travailler sur le tableau mais j'ai des lacunes à ce niveau.
Merci d’avance pour votre aide.
Chris