Le titre réécrit est : Obtenez les produits achetés par les 10 premiers clients
P粉386318086
P粉386318086 2023-08-29 21:31:29
0
1
495
<p>Je souhaite écrire une requête SQL dans laravel/php pour obtenir les 10 principaux produits différents achetés par les clients. </p> <p>La structure de ma table est la suivante :</p> <ul> <li><code>Commandes</code>Tableau (ID client, ID produit, etc...)</li> <li><code>Produits</code>Tableau (ID produit, nom du produit, etc...)</li> </ul> <p>Voici ma tentative de requête : </p> <pre class="brush:php;toolbar:false;">SELECT produits.* DE produits OÙ produits.id = [SELECT DISTINCT (products.id) DE commandes OÙ customer.id=id->list(10)]</pre></p>
P粉386318086
P粉386318086

répondre à tous(1)
P粉951914381

Je peux voir la direction que vous essayez d'aller avec votre requête, mais malheureusement, cela ne vous donnera pas les 10 meilleurs résultats. Au lieu de cela, vous risquez d'obtenir aucun résultat :

SELECT products.* 
 FROM products 
 WHERE products.id=[SELECT DISTINCT (products.id) 
                 ^^^   FROM orders 
                       WHERE customer.id=id->list(10)]

= signifie que vous recherchez une correspondance exacte et que votre sous-requête doit renvoyer 10 lignes de données, si vous utilisez cette opération, vous obtiendrez cette erreur.

Mais si vous le remplacez par IN, vous risquez d'obtenir cette erreur

En fonction de vos tentatives actuelles, votre choix est d'en faire une JOIN. Par contre, je me demandais comment tu avais fait ton top 10 ? Je vois que vous recherchez un produit dans le top 10, mais sur quelle base ? Montant des ventes? Quantité commandée ?

En ce sens, voici un exemple du top 10 des produits triés par quantité commandée.

SELECT P.* 
FROM Products P 
 JOIN ( SELECT product_id
         FROM Orders
        GROUP BY product_id
        ORDER BY SUM(Qty) DESC
    LIMIT 10) O 
ON P.id=O.product_id;

La sous-requête n'est pas nécessaire, mais j'imite la sous-requête que vous avez essayée, même si le processus n'est pas exactement le même. Voici la version sans la sous-requête :

SELECT P.*
FROM Orders O 
 JOIN Products P ON O.product_id=P.id
GROUP BY product_id
ORDER BY SUM(Qty) DESC
LIMIT 10;

Ou peut-être recherchez-vous le top 10 trié par montant des ventes ?

SELECT P.*
FROM Orders O 
 JOIN Products P ON O.product_id=P.id
GROUP BY product_id
ORDER BY SUM(UnitPrice*Qty) DESC
LIMIT 10;

Démo violon

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal