MYSQL一对多关系查询从'many'表返回单行

时间:2018-01-22 11:07:54

标签: mysql sql inner-join limit

我有2个mysql表,即'properties'和'images'。

          Properties
  +------------+---------------+
  | propertyId | propertyTitle |  
  +------------+---------------+
  |          1 | 1 acre land   |  
  |          2 | 2 acre land   |  
  |          3 | 3 acre land   |  
  +------------+---------------+

                Images
  +---------+---------------+---------------+
  | imageId |     image     |  propertyId   |  
  +---------+---------------+---------------+
  |       1 | land.jpeg     |        1      |
  |       2 | landview.jpg  |        1      |
  |       3 | viewland.jpeg |        2      |
  +---------+---------------+---------------+

它们具有一对多的关系,而images表具有属性表的外键。我想执行一个选择属性的查询,然后选择属性的单个图像。 我正在尝试使用的查询是

   SELECT * FROM properties p
    JOIN (SELECT * FROM images im LIMIT 1)
    ON im.propertyId = p.propertyId;

虽然不行。它也不会返回错误。

3 个答案:

答案 0 :(得分:1)

如果要返回所有行,您的查询将变为:

SELECT * FROM properties p
JOIN images im
ON im.propertyId = p.propertyId;

使用LIMIT 1只会从图片表中返回一行,因此您对行有限制

修改

评论后:

通过这种方式,您将获得与您的财产相关联的第一张图片。

SELECT p.*,
    (SELECT im.mage
    FROM images im
    WHERE im.propertyId = p.propertyId
    AND NOT EXISTS (
        SELECT 'NEXT'
        FROM images im2
        WHERE im.propertyId = im2.propertyId
        AND im2.imageId > im.imageId)
    )
FROM properties p;

答案 1 :(得分:0)

尝试以下查询,

SELECT * FROM properties p
JOIN images im
ON im.propertyId = p.propertyId
where p.propertyTitle = '1 acre land'
LIMIT 1

答案 2 :(得分:0)

我们可以使用两个连接来处理这个问题。首先,如您在问题中所怀疑的那样将属性表连接到images表。然后,再做一个加入子查询,找到每个属性的第一个图像。

SELECT
    p.propertyId,
    p.propertyTitle,
    i1.image
FROM properties p
INNER JOIN images i1
    ON p.propertyId = i1.propertyId
INNER JOIN
(
    SELECT propertyId, MIN(imageId) AS min_imageId
    FROM images
    GROUP BY propertyId
) i2
    ON i1.propertyId = i2.propertyId AND
       i1.imageId = t2.min_imageId;