Laravel İlişkili SQL Sorgusunda Sayfalama Sorunu Yaşıyorum
Selamlar, muhtemelen SQL bilgimin yetersizliği nedeniyle bu sorunu çözemiyorum.
Sorun şu ki 3 tablo arasında ilişki kurdum ve sonucu sadece barkoda göre gruplayarak view'de listelemek istiyorum.
Controller'ım ve içierisindeki SQL sorgum şu şekilde,
public function index(Request $request){
$data = DB::table('orderItems as SS')
->select(DB::raw('SS.barcode,
MAX(SS.productName) as productName,
SUM(SS.quantity) as quantity,
COALESCE(NULLIF(MAX(B.salePrice),0), MAX(B.regularPrice)) as unitPrice'))
->leftJoin('products as B','SS.barcode', '=', 'B.barcode')
->leftJoin('orders as S', 'SS.orderID', '=', 'S.ID')
->whereBetween('S.orderDate', ['20210616', '20210616'])
->orderBy('quantity', 'DESC')
->groupBy('SS.barcode')
->limit(1000)
->simplePaginate(5);
return view('rapor', compact('data'));
}
Kodu bu şekilde çalıştırdığımda ilk sayfa geliyor, sonraki sayfaya gitmeyi denediğimde şu hatayı alıyorum;
SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server]
[SQL Server]Column 'orderItems.quantity' is invalid in the select list
because it is not contained in either an aggregate function or the GROUP BY clause.
(SQL: select * from (select SS.barcode, MAX(SS.productName) as productName,
SUM(SS.quantity) as quantity, COALESCE(NULLIF(MAX(B.salePrice),0),
MAX(B.regularPrice)) as unitPrice,
COALESCE(NULLIF(SUM(B.salePrice * SS.quantity),0),
row_number() over (order by [quantity] desc) as row_num from [orderItems] as [SS]
left join [products] as [B] on [SS].[barcode] = [B].[barcode]
left join [orders] as [S] on [SS].[orderID] = [S].[ID] where [S].[orderDate]
between 20210616 and 20210616 group by [SS].[barcode]) as temp_table where row_num between 6 and 11 order by row_num)
Eğer ->groupBy('SS.barcode','quantity')
şeklinde kullanırsam sayfalama çalışıyor ama bu miktar'a göre de grupladığı için aslında istediğim sonucu vermiyor. Bir üründen birden fazla kayıt gösteriyor böyle kullanırsam.
Yada eğer orderby
kullanmazsam sayfalama yine çalışıyor ama bunda da rastgele bir sıralama oluyor, çok satanları üstte göremiyorum!
Sadece barcode'a göre gruplayarak sayfalamanın çalışması mümkünse neyi yanlış yapıyorum?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (1)
Çözüm şöyleymiş arkadaşlar,
Select ifadesine ROW_NUMBER() OVER (ORDER BY SUM(quantity) DESC) AS rownumber,
bu satırı ekleyip ->orderBy('quantity', 'DESC')
satırınıda kaldırınca sıralama istediğim şekilde çalıştı.
Tam hali şöyle yani;
public function index(Request $request){
$data = DB::table('orderItems as SS')
->select(DB::raw('SS.barcode,
MAX(SS.productName) as productName,
SUM(SS.quantity) as quantity,
ROW_NUMBER() OVER (ORDER BY SUM(quantity) DESC) AS rownumber,
COALESCE(NULLIF(MAX(B.salePrice),0), MAX(B.regularPrice)) as unitPrice'))
->leftJoin('products as B','SS.barcode', '=', 'B.barcode')
->leftJoin('orders as S', 'SS.orderID', '=', 'S.ID')
->whereBetween('S.orderDate', ['20210616', '20210616'])
->groupBy('SS.barcode')
->limit(1000)
->simplePaginate(5);
return view('rapor', compact('data'));
}