Соедините три таблицы в MySQL и получите одну строку на идентификатор (по одной строке на каждую сущность в первой таблице) - PullRequest
0 голосов
/ 14 января 2019

у меня есть три таблицы для продуктов, конфигурации продуктов (например, iPhone x 64 черный, iPhone x 64 красный) и инвентаризации продуктов; Я хочу выбрать все продукты и отсортировать их по цене (в таблице конфигурации) и доступности (в таблице инвентаризации), но получить только одну строку для каждого продукта; как id может это сделать? ниже моя структура таблицы MySQL

CREATE TABLE `product_inventories` (
  `inventory_id` bigint(20) NOT NULL,
  `quantity` int(11) NOT NULL,
  `warehouse_id` bigint(20) DEFAULT NULL,
  `config_id` bigint(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `product_configs` (
  `config_id` bigint(20) NOT NULL,
  `product_id` bigint(20) DEFAULT NULL,
  `price` decimal(12,3) DEFAULT NULL,
  `discount_percent` int(11) DEFAULT NULL,
  `sku` varchar(30) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;

CREATE TABLE `products` (
  `id` bigint(20) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `category_id` bigint(20) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

я пробовал этот запрос:

SELECT * 
FROM products 
    LEFT JOIN product_configs ON products.id = product_configs.product_id 
    LEFT JOIN product_inventories inventories ON inventories.inventory_id =
         (SELECT product_inventories.inventory_id from product_inventories
          WHERE product_inventories.config_id = product_configs.config_id
          ORDER by product_inventories.quantity DESC LIMIT 1 ) 
ORDER BY product_configs.price ASC, inventories.quantity DESC

редактирование: с этим запросом:

SELECT *
FROM products 
    LEFT JOIN product_configs ON products.id = product_configs.product_id 
    LEFT JOIN product_inventories inventories ON inventories.inventory_id =
         (SELECT product_inventories.inventory_id from product_inventories
          WHERE product_inventories.config_idd = product_configs.config_id
          ORDER by product_inventories.quantity DESC LIMIT 1 ) 

ORDER BY product_configs.price is null, product_configs.price ASC, inventories.quantity DESC

У меня есть результат ниже; но я хочу один продукт в конфигурации с минимальной ценой и максимальным количеством query result

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Попробуйте это, посмотрите, будет ли это работать:

SELECT *,MIN(price),MAX(quantity) FROM products LEFT JOIN product_configs ON products.id = product_configs.product_id LEFT JOIN product_inventories inventories ON inventories.inventory_id = (SELECT product_inventories.inventory_id FROM product_inventories INNER JOIN product_configs ON product_inventories.config_id = product_configs.config_id ORDER BY product_inventories.quantity DESC LIMIT 1 ) GROUP BY sku ORDER BY product_configs.price ASC, inventories.quantity DESC;

Обратите внимание, что я все еще сохраняю SELECT * и добавил min(price),max(quantity) в конце, чтобы вы могли сделать сравнение. Если это не работает для вас, вам может потребоваться предоставить пример данных и иллюстрацию того, как вы хотите получить желаемый результат.

0 голосов
/ 14 января 2019

Попробуйте:

SELECT 
    ...,
    SUM(quantity) AS total_quantity
FROM products AS p
    LEFT JOIN product_configs AS pc ON pc.product_id = p.id
    LEFT JOIN product_inventories AS pi ON pi.config_id = pc.config_id
GROUP BY p.id
ORDER BY pc.price ASC, pi.quantity DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...