J'ai une table 'panier' comme suit:

+----+---------+-----------+----------+----------+
| id | orderID | productID | quantity |  status  |
+----+---------+-----------+----------+----------+
|  1 |    3443 |       333 |        2 | complete |
|  2 |    3443 |       202 |        4 | complete |
+----+---------+-----------+----------+----------+

Ainsi, pour chaque commande, une nouvelle ligne est ajoutée pour chaque article du panier.

Je veux donc obtenir un «clients également achetés» à partir de cette table. J'utilise MySQL.

Comment puis-je faire ceci? Voici ce que j'ai proposé au début:

SELECT * FROM `cart` WHERE `status` = 'complete' AND `productID` = '333' ORDER BY `ts` DESC

Mais bien sûr, cela ne me montre que les lignes avec ce productID. Ce que je veux vraiment, ce sont les autres produits des commandes qui contiennent ce productID.

Comment puis-je m'y prendre?

-1
Chud37 15 nov. 2017 à 16:00

4 réponses

Meilleure réponse

Je ferais probablement cela avec une auto-jointure sur la table cart:

Select Distinct mapped.productID
  From cart main
  Join cart mapped On main.orderID = mapped.orderID
 Where main.productID != mapped.productID
   And main.productID = 333
1
iainn 15 nov. 2017 à 13:21

Il y a déjà deux bonnes réponses. J'essaie juste de vous donner une idée de l'ordre (ou de l'importance) du productID que vous montrez. Vous pouvez par exemple utiliser une requête comme celle-ci, en utilisant le nombre de fois qu'un certain productID a été acheté (autre que 'ts'):

SELECT `productID`, COUNT(*) AS RC
FROM `cart` 
WHERE `orderID` IN (SELECT `orderID` FROM `cart` WHERE `productid`=333 AND `status` = 'complete' )                      
AND `productID` <> '333' 
GROUP BY  `productID`
ORDER BY RC DESC
1
etsa 15 nov. 2017 à 13:30

Si vous souhaitez que les produits soient dans le même ordre, vous pouvez effectuer une requête par orderID, par exemple:

SELECT * 
FROM cart
WHERE orderID = 3443
AND productID <> 333;

Cela vous donnera tous les other produits inclus dans la même commande.

-1
Darshan Mehta 15 nov. 2017 à 13:14

L'utilisation pourrait utiliser un filtre IN comme celui-ci.

   SELECT
     productID
    FROM 
     cart
    WHERE
       orderID IN(
         SELECT   
          orderId 
         FROM
          cart
         WHERE
            productID = 333
          AND
            status = 'complete'
       )
     AND
       productID <> 333
     AND
       status = 'complete'
0
Raymond Nijland 15 nov. 2017 à 13:14
47308097