2

我有 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 个结果,但是,如果我从 Sub SELECT 中删除 LIMIT 0,1,我将获得所有产品和所有图像的完整列表。

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


我已经将“程序员”代码修改为 MySQL,它工作正常。

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

出于某种原因,在尝试“Bill Karwin”的解决方案时,它让服务器加载了很长时间。

4

4 回答 4

1

这应该有效:

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

如果您有办法确定选择应该返回哪个图像,那么您可以在子选择中添加一个位置,也许还有一个排序依据。

在以下示例中,我们将仅获取最新的活动图像。

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

将“Top 1”编辑并更正为“Limit 0,1”。

于 2009-05-22T06:28:03.910 回答
0

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 个特定图像,也有办法做到这一点。您需要将其包含在您的要求中。:-)

于 2009-05-22T06:28:17.373 回答
0

如果您在 Image 表上有一个 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
于 2009-05-22T07:06:57.107 回答
0

您需要的是 Image 表上的一个标志,以指定它是否是要显示的主图像。有多种方法可以拉取任意图像,但我认为最好确保拉取正确的图像。

于 2009-05-22T07:10:01.297 回答