Как создать сложный запрос, который имеет объединенный запрос и подзапрос, используя построитель запросов Laravel - PullRequest
0 голосов
/ 05 сентября 2018

Добрый вечер, друзья моего кодера,

Как видно из заголовка этого Вопроса, у меня есть немного сложный запрос 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, name, category_id)
  • Категории (id, name, brand_id)
  • Предметы (id, brand_id, in_stock, sold_date)

Теперь я хочу сделать следующее: я хочу получить (название бренда и название категории) и отсортировать их по самым высоким продажам за последний месяц

Это пример таблиц с данными в них:

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 дня, но не повезло, так как это действительно сложно, когда он достигает части подзапроса.

Очень надеюсь, что вы получите помощь от вас, ребята. и дайте мне знать, если вам, ребята, нужно больше объяснений, пожалуйста, я мог бы что-то забыть при написании вопросов.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

С концептуальной точки зрения, как насчет того, чтобы выбрать товары из таблиц товаров за последний месяц, отсортировать их и выбрать марку и категорию с помощью объединения?

Это может быть записано в одном запросе следующим образом:

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()

Я не пытался выполнить этот запрос, но надеюсь, что он поможет. Если я неправильно понял вопрос, поправьте меня.

0 голосов
/ 05 сентября 2018

Если вы немного измените свой 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...