我有以下查询:
SELECT * FROM `product` INNER JOIN `shop`
ON `product`.shop_id= `shop`.id;
我想从我拥有的所有商店中获取所有产品,但我想从每个商店中获取最多 3 种产品。有没有办法在每个连接上指定 MAX ?
这是我的产品表:
这是我的商店表:
尝试在您的代码中使用限制。它可能有效
重要的是要根据主键、外键等来了解表的定义,以提出 SQL 来解决问题。从图像中不清楚 product.id 是否是唯一的。我怀疑这里可能存在数据模型定义问题。如果表格没有标准化到必要的程度,那么读取适当的数据将非常困难(有时是不可能的)。一个合理规范化的表应该看起来像。
产品(id 主键,....)
商店(id 主键,....)
和一个关系表说。
Shop_Product(shop_id 引用 Shop(id),prod_id 引用 Product(id),...)
如果您可以发送表定义,这将对您有所帮助。
尝试这个:
SELECT *
FROM (SELECT *
FROM (SELECT *, IF(@shop = (@shop:=p.shop_id), @id:=@id + 1, @id := 1) temp
FROM `product` p, (SELECT @shop:=0, @id:=1) AS A
ORDER BY p.shop_id, p.updated DESC) AS B
WHERE temp <= 3) AS C
INNER JOIN `shop` s ON C.shop_id= s.id;
询问:
SELECT *
FROM `product` p
INNER JOIN `shop` s
ON `p`.shop_id= `s`.id
WHERE p.id IN (SELECT p2.id
FROM `product` p2
WHERE p2.shop_id = s.id
ORDER BY p2.updated DESC
LIMIT 3)
或者可能:
SELECT *
FROM `product` p
INNER JOIN `shop` s
ON `p`.shop_id= `s`.id
WHERE EXISTS (SELECT p2.id
FROM `product` p2
WHERE p2.shop_id = s.id
ORDER BY p2.updated DESC
LIMIT 3)
在 MySQL 中指定子查询中的限制有点困难(不是不可能,但有点复杂)。
如果您只想要每个商店的三个最新产品 ID,并且可以将它们放在一排,那么您可以使用group_concat()
. 查询要简单得多:
SELECT shop.*,
substring_index(group_concat(product.id order by product.updated desc), ',', 3) as ThreeProducts
FROM `product` INNER JOIN
`shop`
ON `product`.shop_id= `shop`.id
group by shop.id;
结果会将产品 ID 放置在单个字段中,如下所示 '1,2,3'
: