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

Filtrer plusieurs valeurs d'identifiant à l'aide de Navicat dans la base de données MySQL

<p>Je dois filtrer les données en utilisant la date d'expiration et le prix de vente les plus récents sans répéter l'id_product. J'ai essayé de résoudre ce problème mais je ne trouve pas la bonne façon de le faire</p> <p>Voici la requête et les résultats Navicat</p> <pre class="brush:php;toolbar:false;">SELECT product_exp_date.idproduct, produit_exp_date.exp_date, product_exp_date.sell_price DEPUIS produit JOINTURE INTERNE date_exp_produit SUR produit.idproduct = product_exp_date.idproduct PAR GROUPE product_exp_date.exp_date</pre> <pre class="brush:php;toolbar:false;">idproduct exp_date sell_price 8 2022-11-01 300 5 2022-06-08 370 5 2022-06-09 350 7 2022-07-01 380 5 2022-09-20 450 6 2022-10-08 140 6 2023-06-08 150</pré> <p>J'ai essayé de cette façon</p> <pre class="brush:php;toolbar:false;">GROUPE PAR product_exp_date.idproduct</pre> <p>Mais cela me donne des résultats différents</p> <pre class="brush:php;toolbar:false;">idproduct exp_date sell_price 5 2022-06-09 350 6 2023-06-08 150 7 2022-07-01 380 8 2022-11-01 300</pré> <p>Mais j'ai besoin d'obtenir ce résultat</p> <pre class="brush:php;toolbar:false;">idproduct exp_date sell_price 5 2022-06-08 370 6 2022-10-08 140 7 2022-07-01 380 8 2022-11-01 300</pré> <p>Liste de produits</p> <pre class="brush:php;toolbar:false;">productid nom_produit 5A 6B 7C 8 D≪/pré> <p>Product_EXP_DateTable</p> <pre class="brush:php;toolbar:false;">idproduct_exp_date idproduct exp_date sell_price 1 5 2022-06-09 350 2 6 2023-06-08 150 3 5 2022-06-08 370 4 5 20/09/2022 450 5 6 2022-10-08 140 6 7 2022-07-01 380 7 8 2022-11-01 300</pré> <p>Parfois, ma requête comporte des erreurs, de toute façon j'ai besoin d'aide pour résoudre ce problème, Merci. </p>
P粉285587590P粉285587590439 Il y a quelques jours598

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

  • P粉481035232

    P粉4810352322023-08-29 16:08:14

    Tout d'abord, permettez-moi de vous corriger : ce n'est pas une requête Navicat, c'est une requête MySQL. Maintenant, ce sont deux choses différentes. MySQL est une base de données, Navicat est un outil similaire à d'autres outils comme MySQL Workbench, PHPMyAdmin ou SQLyog. Il est conçu pour vous permettre d'exécuter des fonctions de base de données via une interface graphique.

    Ensuite, je vais donner deux requêtes, vous pouvez en utiliser une en fonction de votre version de MySQL. La première requête est la suivante :

    SELECT p1.idproduct,
           p1.exp_date,
           p1.selling_price
    FROM product_exp_date p1 
    JOIN (
       SELECT idproduct,
           MIN(exp_date) AS minexp
       FROM product_exp_date
       GROUP BY idproduct
      ) AS p2
     ON p1.idproduct=p2.idproduct 
     AND p1.exp_date=p2.minexp
    ORDER BY p1.idproduct;

    Vous devriez pouvoir exécuter la requête ci-dessus dans n'importe quelle version de MySQL ou MariaDB. L'idée de​​cette requête passe par idproduct分组获取最小的exp_date,然后将其作为子查询,再次与product表进行连接,以匹配这两个提取的值,以便我们可以提取selling_price.

    Deuxième requête :

    SELECT idproduct,
           exp_date,
           selling_price
    FROM (
       SELECT idproduct,
              exp_date,
              selling_price,
              ROW_NUMBER() OVER (PARTITION BY idproduct ORDER BY exp_date) rn
       FROM product_exp_date
      ) AS p1
    WHERE rn=1;

    Cette requête ne peut être exécutée que sur MySQL v8+ ou MariaDB 10.2+ (et supérieur) qui prennent en charge les fonctions de fenêtre. L'idée est un peu différente par rapport à la requête précédente, nous allons ici nous concentrer sur la génération d'ROW_NUMBER(),然后将其作为子查询,并只添加一个WHERE子句。与之前的查询相比,这不需要JOIN actions basées sur des conditions spécifiques.

    Vous pouvez voir que je n'ai pas pris en compte la table product car je ne l'ai pas vue utilisée dans votre requête d'origine, mais si vous avez besoin de la joindre et que vous ne savez pas comment le faire, donne juste, je laisserai un message et je verrai ce que je peux faire.

    Démo violon

    répondre
    0
  • Annulerrépondre