带连接和限制的postgresql查询

时间:2013-02-16 16:58:37

标签: postgresql

我有一张桌子礼物。礼物可以通过桌子协会获得许多gift_images。我正在尝试返回具有至少一个gift_images关联的特定隐私级别的LIMITED#礼物。

本质上,我想返回带有FIRST关联gift_image的:gift条目(gift_image应按其拥有的位置值排序,位置1为FIRST)。没有关联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

任何帮助?

1 个答案:

答案 0 :(得分: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