我有以下查询:
SELECT * FROM `product` INNER JOIN `shop`
ON `product`.shop_id= `shop`.id;
我想从我所拥有的所有商店获得所有产品,但我想从每个商店获得最多3件产品。有没有办法在每个连接上指定MAX?
这是我的产品表:
这是我的商店表:
答案 0 :(得分:0)
试试这个:
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;
答案 1 :(得分:0)
查询:
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)
答案 2 :(得分:0)
在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'
。
答案 3 :(得分:0)
根据主键,外键等知道表定义以提出SQL来解决问题非常重要。从图像中不清楚product.id是否是唯一的。我怀疑这里可能存在数据模型定义问题。 如果表没有被规范化到必要的程度,则很难(有时不可能)读回适当的数据。 合理规范化的表应该看起来像。
产品(id主键,....)
购物(id主键,....)
和关系表说。
Shop_Product(shop_id参考商店(id),prod_id参考商品(id),...)
如果您可以发送表格定义,将会有所帮助。
答案 4 :(得分:0)
尝试在代码中使用限制。它可能有用