我有2个表,产品表和一个图像表。产品可以为每个记录超过1个图像。我需要一个SQL语句,将列出每个产品1倍的图像,而不是每个产品的所有图片。

我的当前努力的一个按比例缩小的例子是:

SELECT Product.RefCode, Img.ImgPath
FROM Product INNER JOIN (
    SELECT ProductImg.ImgPath, ProductImg.PrdFK
    FROM ProductImg 
    LIMIT 0,1) AS Img ON Product.PrdID = Img.PrdFK;

在上面的例子中返回0的结果,但是,如果我从小组中删除LIMIT 0,1 SELECT我得到的所有产品和所有图像的完整列表。

我只想返回每个产品记录1个图像记录。


我已修改的“程序员”的代码到MySQL并能正常工作。

SELECT Product.RefCode, 
        (Select ProductImg.ImgPath
         From ProductImg
         Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products

有关试图“比尔Karwin的”解决方案时,由于某种原因,它发送的服务器负载很长一段时间。

有帮助吗?

解决方案

此应该工作:

SELECT Product.RefCode,
       (Select Img.ImgPath
        From ProductImg
        Where Product.PrdID = Img.PrdFK LIMIT 0,1) As ImgPath
FROM Product

如果你有一个方法来确定哪些图像应选择回报,那么你可以添加一个地方,也许一个ORDER BY的子选择。

在下面的例子中,我们只会得到最新的活动图像。

SELECT Product.RefCode,
       (Select Img.ImgPath
        From ProductImg
        Where Product.PrdID = Img.PrdFK
          And IsActive = 1
        Order By EntryDate Desc LIMIT 0,1) As ImgPath
FROM Product

和编辑校正 '顶1' 到 '限制0,1'。

其他提示

的MySQL这里有一定的灵活性。您可以使用GROUP BY的结果限制为每个产品一行,然后MySQL将任意选择其中的图像。在实践中,往往是被储存在物理首先在数据库中的图像,但你没有过任何控制。

SELECT p.RefCode, i.ImgPath
FROM Product p INNER JOIN ProductImg i 
  ON (p.PrdID = i.PrdFK)
GROUP BY p.PrdID;

如果你想1的具体的每个产品形象,有办法做到这一点。您需要包括在您的要求。 : - )

如果您对图像表ID列,这应该工作(不管什么SQL产品或版本) -

  
   SELECT
            p.RefCode,
            i1.ImgPath
    FROM
            Product p
    INNER JOIN
            ProductImg i1 ON p.PrdId = i1.PrdFk
    LEFT JOIN
            ProductImg i2 ON i1.PrdId = i2.PrdId
            AND i1.ImgId < i2.ImgId
    WHERE
            i2.ImgId IS NULL
  

您需要的是在图像表中的标志来指定,如果它是要显示的主图像。有拉动的任意图像的方式,但我认为这将是更好地确保你拉正确的图像。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top