Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-ce que le regroupement d'un tableau trié renvoie toujours la première ligne ? MYSQL

Non, ce n'est pas la bonne approche.

Je pense que vous parlez d'une requête comme celle-ci :

SELECT  product.*, MIN(qty)
FROM    product
GROUP BY
        type
ORDER BY
        qty

Ce que vous faites ici utilise MySQL de qui vous permet de sélectionner des colonnes non agrégées/non groupées dans un GROUP BY requête.

Ceci est principalement utilisé dans les requêtes contenant à la fois un JOIN et un GROUP BY sur une PRIMARY KEY , comme ceci :

SELECT  order.id, order.customer, SUM(price)
FROM    order
JOIN    orderline
ON      orderline.order_id = order.id
GROUP BY
        order.id

Ici, order.customer n'est ni groupé ni agrégé, mais puisque vous regroupez sur order.id , il est garanti d'avoir la même valeur au sein de chaque groupe.

Dans votre cas, toutes les valeurs de qty ont des valeurs différentes au sein du groupe.

Il n'est pas garanti à partir de quel enregistrement au sein du groupe le moteur prendra la valeur.

Vous devriez faire ceci :

SELECT  p.*
FROM    (
        SELECT  DISTINCT type
        FROM    product p
        ) pd
JOIN    p
ON      p.id = 
        (
        SELECT  pi.id
        FROM    product pi
        WHERE   pi.type = pd.type
        ORDER BY
                type, qty, id
        LIMIT 1
        )

Si vous créez un index sur product (type, qty, id) , cette requête fonctionnera rapidement.