IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Requête mysql ou comparaisons de tableaux php ? [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    intégrateur web
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : intégrateur web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Requête mysql ou comparaisons de tableaux php ?
    Bonjour à tous,

    voici mon problème :

    je développe un site de recettes de cuisine ; pour faire simple, j'ai une table de recettes 'recettes' (id_recette,nom_recette etc), une table de mots-clef 'tags_recette' (id_tag,nom_tag) et une table de relations entre les recettes et mots-clef 'tags_recette_assoc' (tags_assoc_id,tag_id,tag_recette) où tag_id se réfère à id_tag et tag_recette à id_recette.

    Lorsque j'affiche la page d'une recette, j'aimerais proposer uniquement 3 recettes similaires à la fin, tant qu'à faire celles qui ont le plus de tags en commun avec elle.

    Comment dois-je m'y prendre ? Requête(s) mysql ou comparaisons de tableaux php ? Avec mon peu de pratique je comptais mettre les tag_id correspondant à la recette en question dans un tableau, puis dans une boucle sur toutes les autres recettes de la table mettre les tags correspondants dans un tableau et comparer les tableaux avec un truc du genre array_values(array_intersect)), mais j'imagine que ça mange de la ressource non ? Sachant qu'il y a déjà beaucoup de requêtes dans l'affichage de cette page...

    Merci pour votre aide !

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Salut ! Il faut le faire en SQL, ça ne consomme rien du tout

    Voilà comment moi je l'aurais fait (j'ai testé ma requête avec un jeu d'essai, donc normalement elle fonctionne^^) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT tag_recette, count(tag_id) FROM tags_recette_assoc WHERE tag_id = x or tag_id = y or tag_id = z GROUP BY tag_recette ORDER BY count(tag_id) DESC LIMIT 3

    (avec x, y et z, trois id de la recette que tu consultes actuellement)

    Ton SGBD va compter, pour chaque recette, combien il y a de tag égaux à x, y ou z. Il va te retourner ce nombre associé à chaque recette, et tu ne va garder que les trois plus grands nombres. C'est bien ce que tu voulais ?

    Voilà, j'espère avoir pu t'aider

    PS : Tu m'as donné un mal de chien, avec tes noms de champs barbares... y'a des trucs pas logique du tout, comme l'id_recette que tu appelles "tag_recette" dans l'association x)

    Moi je les auraient appelés comme ça (simple suggestion) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    recette (id, nom, ...)
    tags_recette (id, nom)
    tags_recette (id, id_tag, id_recette)
    Comme ça quand tu manipules une entité, tu as toujours directement son id et son nom, tu ne t’embarrasses pas avec des noms à rallonge qui embrouilles plus qu'autre chose. En revanche, quand tu travailles en dehors de l'entité, tu manipules l'id_de_quelque_chose_d'autre, c'est cohérent !

  3. #3
    Candidat au Club
    Homme Profil pro
    intégrateur web
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : intégrateur web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Salut Taratis, merci pour ta réponse qui m'a été donnée dans un autre forum hier, à peu de choses près, et qui marche (un peu plus généraliste) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT tag_recette, count(tag_id) FROM tags_recette_assoc WHERE tag_id IN (la liste de tags de ma recette) GROUP BY tag_recette ORDER BY count(tag_id) DESC LIMIT 3

    Quant à mes noms de champs, on m'a appris à les nommer ainsi pour éviter les confusions mais je crois que tu as raison, c'est assez laborieux tous ces noms. Enfin maintenant c'est trop tard, j'ai déjà écrit trop de code pour pouvoir revenir en arrière, je le saurai pour mon prochain site

    Merci en tout cas, ta requête est bonne !

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Ah ouais effectivement, ça revient exactement au même de faire comme ça x)

    Ce qu'on t'a appris est correct dans une certaine mesure, parce que c'est vrai que quand tu utilises deux tables qui contiennent le même nom de champs, tu es obligé de préfixé le nom de la table pour éviter les ambiguïtés, mais moi ça me plaît beaucoup d'écrire recette.id, ou tag.id, c'est super cohérent par rapport aux données, tu vas vraiment chercher l'id de la recette, dans la table des recettes x)
    Après si tu es étudiant, respecte les conventions qu'on t'a apprise (j'aimerais pas que tu sois sanctionné à cause de moi), mais pour tes sites persos, tu es libre de faire comme tu l'entends !

    Sinon de rien, pis merci à toi, tu m'as fait refaire du SQL, ça fait plaisir, ça faisait un gros bout de temps que j'y avais pas touché !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/02/2013, 15h25
  2. [PHP 5.0] Copier le résultat d'une requête mysql dans un autre tableau PHP
    Par Didier100 dans le forum Langage
    Réponses: 6
    Dernier message: 30/05/2012, 23h59
  3. Réponses: 4
    Dernier message: 09/01/2007, 11h31
  4. Insérez variable PHP dans requête Mysql
    Par jeremie74 dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/08/2006, 18h21
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo