Хотите получить максимальное количество записей, имеющих общие строки в связанной таблице в Laravel - PullRequest
0 голосов
/ 19 сентября 2018

У меня три таблицы в laravel, одна - средняя таблица:

CREATE TABLE ордеров (id INT (10) ПЕРВИЧНЫЙ КЛЮЧ, НЕ НУЛЬ AUTO_INCREMENT, order_number VARCHAR (100) NOT NULL);

CREATE TABLE products (id INT (10) ПЕРВИЧНЫЙ КЛЮЧ NOT NULL AUTO_INCREMENT, заголовок VARCHAR (100) NOT NULL);

CREATE TABLE orders_products (order_id INT (10) NOT NULL, product_id INT (10) NOTNULL);

Я хочу получить два верхних заказа, у которых есть общие продукты, большее число здесь не имеет значения,

То, что считается, это заказ C, который имеет 5 заказов, 1,3,4, 5,7 и orderF, которые также имеют 1,2,3,4,5,6,8, поэтому у них есть общие 1,3,3,5, это то, что я хочу иметь, даже если у других есть один 2,7,9,12,13,15,17,23 и другие 2,4,6,8,9,11,12,14,15,16,17 это не то, что я хочу, но у большинства есть больше продуктовобщего

Большое спасибо

Это дает неточные результаты:

  $orders = 
  DB::table('orders')
 ->select('orders.id as ordid', 'orders.order_number as order_number',

     DB::raw('COUNT(orders_products.product_id) as counter'  )  )
    ->join('orders_products', 'orders.id', '=', 'orders_products.order_id')
    ->join('products as prod1', 'prod1.id', '=', 

     'orders_products.product_id')
    ->join('products as prod2', 'prod1.id', '=', 'prod2.id')
    ->groupBy(  'orders.order_number')
    ->orderByRaw('MAX(orders_products.product_id) DESC')

    ->limit(2)
    ->get();

1 Ответ

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

Чтобы получить заказы с наибольшим количеством продуктов, вам нужно использовать предложение HAVING и подзапрос, чтобы получить желаемые результаты.

Запрос ниже работает так:

  1. Сначала подзапрос (с вложенным подзапросом) находит наибольшее количество товаров в одном заказе -highest_amount значение
  2. Затем запрос на упаковку находит все заказы, у которых на столько товаров в заказе, сколько будет наибольшее количество из подзапроса.

Это будетВыглядит примерно так:

SELECT 
   orders.id as ordid, 
   orders.order_number as order_number, 
   COUNT(orders_products.product_id) as counter
FROM orders
JOIN orders_products ON orders.id = orders_products.order_id
JOIN products ON products.id = orders_products.product_id
GROUP BY orders.order_number
HAVING COUNT(orders_products.product_id) >= (
   SELECT MAX(products_in_order) as highest_amount FROM (
      SELECT COUNT(orders_products.product_id) as products_in_order
      FROM orders
      JOIN orders_products ON orders.id = orders_products.order_id
      JOIN products ON products.id = orders_products.product_id
      GROUP BY orders.order_number
   ) top_amounts
)

Я проверил это в этой скрипте SQL - она ​​работает как положено (вы получаете все заказы с большинством продуктов - в нашем случае 3)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...