0

我有以下查询:

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

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

这是我的产品表:

在此处输入图像描述

这是我的商店表:

在此处输入图像描述

4

5 回答 5

0

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

于 2013-06-19T11:12:13.970 回答
0

重要的是要根据主键、外键等来了解表的定义,以提出 SQL 来解决问题。从图像中不清楚 product.id 是否是唯一的。我怀疑这里可能存在数据模型定义问题。如果表格没有标准化到必要的程度,那么读取适当的数据将非常困难(有时是不可能的)。一个合理规范化的表应该看起来像。

产品(id 主键,....)

商店(id 主键,....)

和一个关系表说。

Shop_Product(shop_id 引用 Shop(id),prod_id 引用 Product(id),...)

如果您可以发送表定义,这将对您有所帮助。

于 2013-06-19T10:52:48.500 回答
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;
于 2013-06-19T10:41:52.157 回答
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)
于 2013-06-19T10:43:23.213 回答
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'

于 2013-06-19T10:43:59.867 回答