首页 > 解决方案 > 如何使用查询构建器 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 天,但没有运气,因为当它到达子查询部分时它真的很复杂。

真心希望能得到各位的帮助。如果你们需要更多解释,请告诉我,我可能在写问题时忘记了一些东西。

先感谢您。

标签: phpmysqllaravel

解决方案


如果你稍微改变一下你的 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();

推荐阅读