Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

361
Views
Laravel selecciona productos únicos con el precio más bajo de una tabla

Buen día, estoy tratando de obtener productos únicos con precios más bajos. Tengo una tabla de productos como esta: ingrese la descripción de la imagen aquí

Me gustaría obtener una lista de productos con todas las columnas. Ahora bien, hay algunos productos que tienen más de un proveedor, en ese caso quiero tomar el producto con el cost_price más bajo.

Hasta ahora he probado esto

 $products = DB::table('products') ->select('identifier') ->selectRaw('MIN(cost_price) as cost_price') ->where('stock', '>', 0) ->groupBy('identifier') ->orderBy('cost_price', 'asc') ->distinct()->get();

Esta consulta me devuelve los resultados correctos, pero no puedo agregar más columnas cada vez que agrego una columna, por ejemplo, stock en select. Necesito agregar también en GroupBy y luego obtengo todos los productos.

¿Cómo hacerlo? Gracias por leer.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Necesita una solución/enfoque greatest-n-per-group para este problema.

La consulta;

 SELECT products.* FROM products INNER JOIN (SELECT identifier, MIN(cost_price) AS minPrice FROM products WHERE stock > 0 GROUP BY identifier) AS sub ON sub.minPrice = products.cost_price and sub.identifier = products.identifier;

La versión del generador de consultas;

 $sub = DB::table('products') ->where('stock', '>', DB::raw(0)) ->groupBy('identifier') ->select('identifier', DB::raw('min(cost_price) as minPrice')); return DB::table('products') ->join(DB::raw('(' . $sub->toSql() . ') as sub'), function ($join) { $join->on('sub.minPrice', '=', 'products.cost_price'); $join->on('sub.identifier', '=', 'products.identifier'); }) ->get(['products.*']);
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!