Maison  >  Questions et réponses  >  le corps du texte

Le titre réécrit est : Obtenez les produits achetés par les 10 premiers clients

<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粉386318086P粉386318086417 Il y a quelques jours446

répondre à tous(1)je répondrai

  • P粉951914381

    P粉9519143812023-08-30 00:58:10

    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

    répondre
    0
  • Annulerrépondre