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 :

Proposition d'articles en fonction de commandes déjà passées


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut Proposition d'articles en fonction de commandes déjà passées
    Bonjour,

    J'ai une application, qui affiche une page détails d'un produit. Sur cette page, j'aimerai afficher une liste d'autres produits.
    En gros, j'aimerai afficher les produits qui ont déjà été commandés avec cet article, sur les commandes précédentes.

    Voici ma table commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE IF NOT EXISTS `achats` (
      `achat_id` int(11) NOT NULL AUTO_INCREMENT,
      `achat_commande_id` int(11) NOT NULL,
      `achat_parent_id` int(11) NOT NULL,
      `achat_item_id` int(11) NOT NULL,
      `achat_item_type` tinyint(4) NOT NULL,
      `achat_item_name` varchar(100) NOT NULL,
      `achat_price` float NOT NULL,
      `achat_quantity` tinyint(11) NOT NULL,
      `achat_total` float NOT NULL,
      `achat_statut` tinyint(4) NOT NULL,
      PRIMARY KEY (`achat_id`),
      KEY `achat_article_id` (`achat_item_id`),
      KEY `achat_statut` (`achat_statut`),
      KEY `achat_commande_id` (`achat_commande_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
    Mais je n'arrive pas à formuler ma requête de manière à récupérer un tableau contenant les 4 premiers champs achat_item_id, classés par achat_quantity par ordre décroissant. J'ai l'impression que ce n'est pas possible en une seule requête en fait.

    Une piste ?

  2. #2
    Membre éprouvé
    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
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Doit-on sommer les quantité achetées pour chaque produit, ou ne conserver que les plus grosses quantité sur une commande pour chaque produit?
    Vous pouvez déjà essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT 
    	   a.achat_item_id,
    	   sum(a.achat_quantity) AS achat_quantity
    FROM achats a
    WHERE EXISTS
    (
     SELECT *
     FROM achats ap
     WHERE ap.achat_item_id = 'id_produit'
     AND a.achat_commande_id = ap.achat_commande_id
    )
    AND a.achat_item_id <> 'id_produit' 
    GROUP BY a.achat_item_id 
    ORDER BY achat_quantity DESC

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    je voudrai effectivement sommer les quantités.

    Disons que ma page details.php affiche l'item #1.

    Cet item se trouve dans 2 commandes précédentes (et validées, commande_statut > 0).

    Sur la commande 1, on trouve également l'item #2, avec la quantité 2.
    Sur la commande 2, on trouve également l'item #2, avec la quantité 3, et l'item #3, avec la quantité 4.

    Au final, il me faudrait un tableau de ce type :

    Item #2 : 5
    Item #3 : 4

    Je vais tester ta requête.
    EDIT : Et ça marche nickel.. Franchement bravo. Quand j'analyse la requête, je me dis que j'ai bien fait de demander de l'aide, c'était nettement au dessus de mes connaissances en SQL.
    Par curiosité, pourrais-tu m'expliquer vite fait ce que signifie le signe "<>" que tu utilises dans la requête ?

  4. #4
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par van___fanel Voir le message
    Par curiosité, pourrais-tu m'expliquer vite fait ce que signifie le signe "<>" que tu utilises dans la requête ?
    Bonjour,

    vite fait : le signe <> représente "différent de"

    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Arnaud F. Voir le message
    Bonjour,

    vite fait : le signe <> représente "différent de"

    ++
    != n'existe pas en SQL ?

  6. #6
    Membre éprouvé
    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
    Points : 965
    Points
    965
    Par défaut
    C'est reconnu par la plupart des SGBD, mais la norme est <>.

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