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 SQL Discussion :

4 articles de catégories différentes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 144
    Par défaut 4 articles de catégories différentes
    Bonjour, pour les besoins d'un site de commerce, je dois aller faire une requête sur ma base pour retourner 4 articles en fonction de celui affiché, avec les conditions suivantes :

    Les 4 articles doivent être de catégorie différentes (ex : deux robes, une veste et un sac, c'est pas bon, mais une robe, un bijou, une veste et un sac c'est OK)
    Et les articles ne doivent pas être de la même catégorie que celui affiché (ex : si on affiche un sac, on ne doit pas retourner de sac parmi les 4 articles)

    Ma base de donnée se présente de la manière classique :

    1. une table prod avec un ID_PROD
    2. une table categorie avec un ID_CAT
    3. et pour les relier la table cat_prod avec ID_PROD, ID_CAT et NUM_CAT

    Si qqn a une idée pour la requête, ce qui me bloque c'est les 4 articles de catégories différentes.

    j'ai bien pensé faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT pr.ID_PROD, cp.ID_CAT FROM prod pr
    JOIN cat_prod cp ON (pr.ID_PROD = cp.ID_PROD)
    WHERE cp.ID_CAT != $id_cat_en_cours ORDER BY RAND() LIMIT 0,4
    Je vais essayer, je vous retiens au courant.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 144
    Par défaut
    Bon, j'ai essayé la requête, seulement ça me retourne des articles de même catégories... Donc pas bon.. J'ai essayé en ajoutant un GROUP BY cp.ID_CAT comme l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT pr.ID_PROD, cp.ID_CAT
    FROM prod pr
    JOIN cat_prod cp ON ( pr.ID_PROD = cp.ID_PROD )
    WHERE cp.ID_CAT !=15
    GROUP BY cp.ID_CAT
    ORDER BY RAND( )
    LIMIT 0 , 4
    ça me retourne bien des catégories différentes, mais le problème, c'est que pour une catégorie, ça me retourne toujours le même article...

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Salut,
    Peux tu préciser sur quel environnement tu travailles?

  4. #4
    Scorpi0
    Invité(e)
    Par défaut
    Rand() c'est du MySQL non ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 144
    Par défaut
    Je travaille sur PHP/MySQL...

    PHP 5 et MySQL 5

    Et oui, scorpio, RAND() c'est du MySQL (je ne savais pas qu'il y avait des fonctions spécifiques à certains SGBD)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 144
    Par défaut
    Il y a toujours une solution en deux requêtes.

    A savoir une première pour le retourner au hasard 4 catégories (hormis celle en cours)

    puis pour chacune de ces catégories on va de nouveau faire une requête pour aller chercher au hasard un article dedans...

    Mais cela me fait 5 requêtes sur le serveur, alors s'il y a moyen de tout faire en une, je prends...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Oui, j'avais noté que c'était pas du Oracle, ca va pas m'aider ça, je connais pas la syntaxe mysql
    Bref, en attendant quelqu'un qui pourra t'en dire plus, je pense que l'idée serait d'assigner une valeur random à chaque id_prod, d'ordonner une sous requête selon ce champs et de ne récupérer que les premières lignes.

    En Oracle la sous requête ressemblerait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_cat, id_prod, row_number() over (partition by id_cat ORDER BY dbms_random.value) as selection from ods.matable
    Reste à ajouter une clause WHERE selection = 1 dans ta requête principale.

  8. #8
    Scorpi0
    Invité(e)
    Par défaut
    Oui, sur Oracle c'est DBMS_RANDOM.VALUE par exemple.

    Sinon, ton problème vient peut être d'un problème d'initialisation de la graine (seed) de la fonction Rand() de MySQL, essayes de regarder de ce côté.

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ton problème ressemble à celui pour lequel j'ai donné une réponse ce week-end. Tu peux peut-être t'en inspirer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 144
    Par défaut
    Oui effectivement Cinéphil... et cette syntaxe va faire bien plus que m'aider....
    Je teste ça tidsuite et je vous remets la requête finale...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 144
    Par défaut
    C'est OK... voici la requête que j'effectue.. BOn faut encore que j'y ajoute les champs nécessaires pour aller chercher les données mais grossomodo voici le principe de la chose...

    Je connaissais pas du tout, et d'ailleurs j'ai pas tout compris, mais le principal c'est que ça marche...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT tmp.ID_PROD, tmp.ID_CAT
    FROM (
       SELECT pr.ID_PROD, cp.ID_CAT
       FROM prod pr
       JOIN cat_prod cp ON ( pr.ID_PROD = cp.ID_PROD )
       WHERE cp.ID_CAT !=15
       ORDER BY RAND( )
    ) tmp
    GROUP BY ID_CAT
    ORDER BY RAND( )
    LIMIT 0 , 4
    Merci du coup de pouce Cinephil, et merci aux autres aussi...

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

Discussions similaires

  1. [Article] Comprendre les différents design patterns de construction
    Par Jean-Michel Ormes dans le forum Général Dotnet
    Réponses: 11
    Dernier message: 09/02/2014, 19h55
  2. Modèle de contenu d'article par catégorie
    Par sbaudry dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 03/04/2010, 17h01
  3. [Typo3] Recherche CMS un article : plusieurs catégories
    Par SebCom dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 30/11/2006, 14h49

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