我有三个产品表,产品配置(例如,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
我有以下结果;但是我想要每个配置一个产品的最小价格和最大数量
答案 0 :(得分:0)
尝试一下:
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
答案 1 :(得分:0)
尝试一下,看看是否可以使用:
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)
,以便进行比较。如果这对您不起作用,则可能需要提供一些数据示例,并说明所需输出的方式。