Tengo una tabla en la que quiero seleccionar product_name con el precio mínimo / mínimo:

product_name | price 
Cat          |   12
Dog          |   21
Cat          |   14
Dog          |   20
Fish         |   10
Fish         |    3

EL DESEO La salida debe ser

Cat  | 12
Dog  | 20
Fish | 3

ABAJO ES MI CONSULTA SQL

$products = DB::table('products')
            ->orderBy('products.products_price', 'asc')
            ->groupBy('products.products_name')
            ->get();

Cuando usé este script, solo muestra el precio más alto / máximo, no el precio más bajo

1
Lamp Soft 30 jul. 2020 a las 17:14

2 respuestas

La mejor respuesta

Necesita un agregado en lugar de ordenar. Para Laravel, eso significa pasar las columnas junto con un DB :: raw:

$products = DB::table('products')
        ->orderBy('products.products_price', 'asc')
        ->groupBy('products.products_name')
        ->select(['product_name', DB::raw('min(price) as price')])
        ->get();

Editar para ID

Tomando la respuesta aquí: SQL: Agrupar por valor mínimo en un campo mientras selecciona distintas filas la consulta de mysql sería

SELECT p1.*     
FROM products p1 INNER JOIN
    (
        SELECT product_name, MIN(price) AS as min_price
        FROM products
        GROUP BY product_name
    ) p2 ON p1.product_name = p2.product_name AND p1.price = p2.min_price

Ahora tenemos que convertirlo a Query Builder

$products = DB::table('products AS p1')
   ->join(DB::raw('(
    SELECT product_name, MIN(price) AS as min_price
    FROM products
    GROUP BY product_name
) AS p2'), 
    function($join)
    {
       $join->on('p1.product_name', '=', 'p2.product_name');
       $join->on('p1.price', '=', 'p2.min_price');
    })
    ->get(['p1.id', 'p1.product_name', 'p1.price']);

Esto no ha sido probado, así que espero que funcione.

1
aynber 30 jul. 2020 a las 16:35

Problema:

No está definiendo que el atributo de precio deba agregarse al mínimo.


Solución:

Si desea el precio máximo, debe seleccionar la agregación MIN (). Puede hacer esto usando ->selectRaw('MIN(price) as max_price').


Tenga en cuenta:

Si desea que también se seleccionen otros atributos, simplemente agréguelos separados por comas.

->selectRaw('name, MAX(price) as max_price')

@edit

¿Todavía usas orderBy? Si no es así, pruébelo con orderBy ('products.product_price', 'ASC')

0
Aless55 30 jul. 2020 a las 16:42