[英]How to build complex query that has join query and subquery using query builder Laravel
晚上好,我的編碼員朋友,
就像這個問題的標題說的那樣,我有一個稍微復雜的mysql查詢,我試圖在Laravel中使用查詢生成器將其記錄下來,但是每次我嘗試編寫它時,我都會在到達子查詢時停止。 我將寫下查詢,也將讓您知道查詢的作用。
SELECT
brands.name_en as brand_name_en,
brands.name_ar as brand_name_ar,
brands.brand_url as brand_url,
brands.description_ar as description_ar,
brands.description_en as description_en,
categories.name_en as category_name_en,
categories.name_ar as category_name_ar
FROM
brands
INNER JOIN categories ON brands.category_id = categories.id
WHERE
(brands.status = "1")
AND
(
brands.id IN (
SELECT
distinct(items.brand_id)
FROM
items
WHERE
items.in_stock = "1"
GROUP BY
(items.brand_id)
)
)
查詢說明:
我有三個表:
現在,我要執行以下操作:我想檢索(品牌名稱和類別名稱)並根據上個月的最高銷售額對它們進行排序
這是表中包含數據的示例:
Brands Table
------------
id name category_id
1 googleplay 1
Categories Table
--------------------------
id name brand_id
1 cards 1
items Table
-----------
id brand_id in_stock selling_date
1 1 0 null
1 1 1 2017-02-02 04:04:49
嘗試了將近2天,但運氣不佳,因為它到達子查詢部分時確實很復雜。
真的希望能從你們那里尋求幫助。 如果需要進一步的解釋請告訴我,我在寫問題時可能忘記了一些東西。
先感謝您。
如果您稍微更改了sql,則可以使用內部聯接進行更改:
SELECT brands.name, categories.name
FROM brands
INNER JOIN categories ON brands.category_id = categories.id
INNER JOIN items ON categories.id = items.brand_id
WHERE brands.status = 1 AND items.in_stock = 1
將其轉換為Laravel很簡單:
\DB::table('brands')
->join('categories', 'brands.category_id', '=', 'categories.id')
->join('items', 'brands.id', '=', 'items.brand_id')
->select('brands.name as brand', 'categories.name as category')
->where('brands.status', 1)
->where('items.in_stock', 1)
->get();
從概念上講,我們如何從上個月的項目表中選擇項目,對其進行排序,然后通過聯接來獲取品牌和類別。
可以在單個查詢中編寫,如下所示:
DB::table('items')
->join('brands', 'items.brand_id', '=', 'brands.id')
->join('categories', 'brands.category_id', '=', 'categories.id')
->select('brands.name as brand', 'categories.name as category')
->where('brands.status', 1) // as per your query
->whereRaw(YEAR(items.selling_date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)) // year condition
->whereRaw(MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)) // last month condition
->orderBy('items.in_stock', 'desc') // orderBy the sales
->distinct() // Since you only require brand names and category names, choosing distinct will avoid the need of the GROUP BY eliminating the multiple occurances of a brand in the items table
->get()
我沒有嘗試運行此查詢,但希望對您有所幫助。 如果我誤解了這個問題,請隨時糾正我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.