以特定顺序使用LEFT JOIN进行查询

时间:2013-07-22 07:40:36

标签: mysql

我有一个名为Products的表格,其中包含:

ProductID
Name

一张名为Product_Images的表格,其中包含:

ImageID
ProductID
Filename
Image_Type
Image_Order

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

我使用的查询是:

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有关,我已经尝试了各种方法来获得结果,但现在我只是围成一圈。

有人可以提出建议吗?

1 个答案:

答案 0 :(得分:1)

这不适合你吗?

由于您尝试加入整个图片表并仅返回1张图片而且您只返回1件商品,因此您可以直接使用LEFT JOIN上的Product_Images并移动{{1} }和ORDER BY在它之外,因为它不会仅影响产品图像。

LIMIT

<强> Live DEMO.

您仍然可以像以前一样对其应用null:

   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