2013-02-16 70 views
0

我有一个表礼物。礼品可以通过表格关联有许多gift_images。我正在尝试返回一个具有至少一个gift_images关联的特定隐私级别的有限#礼物。postgresql查询加入并限制

实质上,我想返回:礼品条目与其关联的第一个gift_image(gift_image应该按照其具有的位置值排序,其中位置1是第一个)。没有gift_image关联的礼物应该被忽略。

这是我的,但它绝对不能工作。

SELECT gifts.* FROM gifts LEFT JOIN gift_images ON gifts.id = gift_images.gift_id WHERE gifts.privacy = 2 ORDER BY gift_images.position ASC LIMIT 10 

任何帮助?

回答

0

如果你想忽略没有图像的礼物,你应该使用INNER JOIN而不是LEFT JOIN。另外,为了使查询有意义,您应该从gift_images中选择一些字段以及来自礼物的字段。

如果有礼物图像的所有礼物有哪个位置= 1的图像,此查询应该这样做:

SELECT gifts.*, gift_images.* 
FROM gifts 
INNER JOIN gift_images 
ON gifts.id = gift_images.gift_id 
WHERE gifts.privacy = 2 
AND gift_images.position = 1 
LIMIT 10 

否则,你可以尝试

SELECT gifts.*, gift_images.* 
FROM gifts 
INNER JOIN (SELECT gift_id, MIN(position) AS min_position 
      FROM gift_images 
      GROUP BY gift_id) AS positions 
ON positions.gift_id = gifts.id 
INNER JOIN gift_images 
ON gift_images.gift_id = gifts.id 
AND gift_images.position = positions.min_position