0

我有一张桌子叫Products

ProductID
Name

还有一张名为Product_Images

ImageID
ProductID
Filename
Image_Type
Image_Order

可以是两个选项(A 或 B)之一,Image_Type并且该顺序允许以特定顺序显示每种类型的多个图像。

我使用的查询是这样的:

SELECT ProductID,
       Name, 
       IFNULL((SELECT Filename 
                 FROM Product_Images 
                WHERE ProductID = Products.ProductID 
             ORDER BY Image_Type DESC, 
                      Image_Order 
                LIMIT 1),
             'no_image.jpg') AS Image_Name 
  FROM Products 
 WHERE ProductID in (966, 967, 968)

注意:ProdictID 的列表由搜索结果指定。

Product_Images在我为 Alt/Title 文本的表中添加了一个字段之前,这一切正常。

所以,我尝试了以下

   SELECT ProductID, 
          Name,
          pi1.Filename, 
          pi1.alttag
     FROM Products 
LEFT JOIN (SELECT * 
             FROM Product_Images 
            WHERE Product_Images.ProductID = Products.ProductID 
         ORDER BY Image_Type DESC, 
                  Image_Order 
            LIMIT 1) AS pi1 
               ON Products.ProductID = pi1.ProductID 
            WHERE Products.ProductID in (966, 967, 968)

但它不起作用,我收到错误消息:

Unknown column 'products.productid' in 'where clause'

我已经确定此错误与 JOIN 派生表中的 Products.ProductID 相关,并且我尝试了各种方法来获得结果,但现在我只是在兜圈子。

任何人都可以提供建议吗?

4

1 回答 1

1

这不适合你吗?

由于您尝试加入整个图像表并仅返回 1 个图像并且您也仅返回 1 个产品,因此您可以直接使用LEFT JOINonProduct_Images并将其移到其ORDER BY外部LIMIT,因为它不会仅影响产品图像。

   SELECT p.ProductID, 
          p.Name,
          p.Price,
          i.Filename, 
          i.alttag
     FROM Products p
LEFT JOIN (SELECT ProductID,
                  Filename,
                  alttag
             FROM Product_Images
         ORDER BY Image_Type DESC, 
                  Image_Order) AS i
       ON p.ProductID = i.ProductID
    WHERE p.ProductID IN (1, 2, 3)
 GROUP BY p.ProductID
 ORDER BY p.Price

现场演示。

您仍然可以像以前一样将 null 应用于它:

IFNULL(pi1.Filename, 'no_image.jpg') AS Image_Name, 
IFNULL(pi1.alttag, 'no information') AS Alt_Text
于 2013-07-22T08:04:39.490 回答