SQL查询内部联接并限制为最近3次

时间:2013-06-19 10:25:40

标签: mysql sql select

我有以下查询:

SELECT * FROM `product` INNER JOIN `shop`
ON `product`.shop_id= `shop`.id;

我想从我所拥有的所有商店获得所有产品,但我想从每个商店获得最多3件产品。有没有办法在每个连接上指定MAX?

这是我的产品表:

enter image description here

这是我的商店表:

enter image description here

5 个答案:

答案 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)

尝试在代码中使用限制。它可能有用