簡體   English   中英

如何使用查詢生成器Laravel構建具有聯接查詢和子查詢的復雜查詢

[英]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)
        )
    )

查詢說明:

我有三個表:

  • 品牌(id,名稱,category_id)
  • 類別(id,名稱,brand_id)
  • 項目(id,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM