MySQL左连接限制子查询选择min(值)

时间:2012-12-04 16:24:46

标签: mysql left-join

很抱歉,如果标题不是很清楚......

我有两张表productsimages

products相关。product_id = imagesproduct_id

每个产品在images表上都有几个与之相关的图像,

这两个表都有一个列宽值我希望ORDER BY(product_orderimage_order)。

我正在寻找的结果是一个包含所有published products的列表,其中每个产品只有一个图片(和一个结果),图片应为image_order列中值最小的一个。

我将下面的代码放在我在此处找到的其他答案中并且它正常工作,唯一的问题是列image_order允许重复,因此image_order中的相同值的相同产品的图像存在于{{ 1}}我每个产品都会得到多个结果。

SELECT products.*, images.image_name, images.image_order

FROM products

LEFT JOIN images ON (
    images.product_id = products.product_id 
    AND images.image_order = (
        SELECT min(image_order) 
        FROM images 
        WHERE product_id = products.product_id
    )
)

WHERE products.published = 1
ORDER BY products.product_order ASC

编辑(我的表格):

产品

product_id  |  product_name  |  product_order
____________|________________|_________________
     1      |  Fist Product  |        1
     2      | Second Product |        2
     3      | Third Product  |        3

图片

 image_id   |   product_id   |    image_name    |  image_order
____________|________________|__________________|_________________
     1      |       1        |  Fist Image URL  |        1
     2      |       1        | Second Image URL |        1
     3      |       2        | Third Image URL  |        1
     4      |       3        | Fourth Image URL |        1

我从此查询得到的结果:

  1. Firt Product + First Image

  2. Firt Product + Second Image

  3. 第二产品+第三图像

  4. 第三产品+ FourthImage

  5. 我需要的结果:

    1. Firt Product + First Image

    2. 第二产品+第三图像

    3. 第三产品+ FourthImage

1 个答案:

答案 0 :(得分:3)

你可以使用这样的东西,但这不是最好的选择。随着您的表格的进一步了解,可能有更好的答案:

select products.*,
(
    select image_name from images
    where product_id = products.product_id
    order by image_order asc
  limit 1
) as 'image_name'
from products
WHERE products.published = 1
ORDER BY products.product_order ASC