在连接查询中选择一列中具有最小值的行

Selecting row with minimal value in one column, in a join query

我有两个表:tblBusinesses、tblBusinessImages 在 tblBusinesses.fldID = tblBusinessImages.fldBusinessID 上匹配,如下所示:

tblBusinesses
=============
fldID | fldName | fldTitle | fldBody
-------------------------------------
1     | b1      | title1   | body1
2     | b2      | title2   | body2
3     | b3      | title3   | body3
4     | b4      | title4   | body4

tblBusinessImages
=============
fldID | fldFileName | fldTitle  | fldBusinessID | fldOrder
-----------------------------------------------------------
1     | img1.jpg    | img1title | 1             | 3
2     | img2.jpg    | img2title | 1             | 1
3     | img3.jpg    | img3title | 1             | 2

我想编写一个查询,为 tblBusinesses 中的每个企业获取 tblBusinessImages 中具有最小 fldOrder 的图像。换句话说,在我上面写的示例中,我想从 tblBusinessImages 中获取业务 b1、title1、body1 以及 img2.jpg(因为它在 tblBusinessImages 中具有最小的 fldOrder)。

如有任何帮助,我们将不胜感激!

如果 fldOrder 总是从每个 fldBusinessID 开始,则查询变为

SELECT b.fldName, b.fldTitle, b.fldBody, i.fldFileName
FROM
    tblBusinesses b
    LEFT JOIN tblBusinessImages i
        ON (b.fldID = i.fldBusinessID AND i.fldOrder = 1)

如果没有,您将不得不使用子查询。

SELECT b.fldName, b.fldTitle, b.fldBody, firstImage.fldFileName
FROM
    tblBusinesses b
    LEFT JOIN (
        SELECT i.fldBusinessID, i.fldFileName
        FROM
            tblBusinessImages i
        WHERE
            i.fldOrder = (SELECT MIN(x.fldOrder) 
                          FROM tblBusinessImages x
                          WHERE x.fldBusinessID = i.fldBusinessID)
    ) firstImage
        ON b.fldID = firstImage.fldBusinessID 

请注意,左联接使查询 return 也使企业完全没有图像。

如果您只需要包含最小订单 ID 可以具有任何值的图像的条目:

SELECT b.fldName, b.fldTitle, b.fldBody, i.fldFileName
FROM
    tblBusinesses b
    INNER JOIN tblBusinessImages i
        ON b.fldID = i.fldBusinessID
WHERE
    i.fldOrder = (SELECT MIN(x.fldOrder)
                  FROM tblBusinessImages x
                  WHERE x.fldBusinessID = i.fldBusinessID)

是否只想获取fldOrder 最小的ONE 条目? 没有测试这个查询:

SELECT b.fldName,b.fldTitle,b.fldBody,bi.fldFileName,bi.fldOrder 
FROM tblBuisnesses b 
INNER JOIN tblBuisnessImages bi ON bi.fldBusinessID=b.fldID ORDER BY b.fldOrder DESC LIMIT 1;