我正在使用PostgreSQL 10和Python3,我知道如何进行简单的选择或连接,当需要组合4个相关的表2×2时,购买我有问题。
我提到,我使用Phyton,以防有必要使用代码组合查询。
我有以下表: Company、CompanyLogo、Product、ProductImage,如下所示
- Company Logo O1O with Company
- Product has FK to Company
- ProductImage FK with Product
Logo
Id | path | company_id
1 url 1
-----------
Product
Id | company_id
1 1
2 1
ProductImage
Id | path | product_id
1 url 1
2 url 1
3 url 1
我需要:
- the company slug
- the logo
- up to 3 products and their first image
- the company slug
- the logo
- all product and their first image
发布于 2018-05-09 17:58:49
这里的问题是,您对产品或图像的数量有这样的限制。
我试图在子查询中解决这个问题,通过确定较低in的数量,只选择每个公司/产品的前n个产品/图片。只有在同一公司或产品的ID小于或等于n个ID的情况下,ID才匹配。换句话说,每个公司/产品的产品/图像的n(或小于n,如果没有更多)的最低it将使它的结果。对于logo
来说,如果我说得对,company_id
是唯一的,所以这里不需要这个步骤。(如果我误解了这一点,这将是一个子查询模拟的其他。)对于确实获取第一张图片的图片,假定ID会自动递增。所以,如果你的问题中的“第一”必须从字面上看,那也是给出的。
我以为你想看到一个公司/产品,即使没有标志/产品/图片。所以我用了LEFT JOIN
。
product
,一个用于productimage
:
从c公司选择c.id,c.slug,l.id,l.path,p.id,i.id,i.url,l.company_id = c.id LEFT JOIN (选择pi.id,来自产品pi的pi.company_id (从产品pii中选择计数(*),其中pii.company_id = pi.company_id和pii.id <= pi.id) <= 3) p= c.id左联接(选择i.id,i.product_id,来自productimage ii的i.path,其中(从productimage iii选择计数(*),其中iii.product_id = ii.product_id和iii.id <= ii.id) <= 1) I在i.product_id =p.id上;productimage
的一个子查询;将?
替换为相应的公司ID:
选择c.id,c.slug,l.id,l.path,p.id,i.idi.url从c公司左加入徽标l ON l.company_id = c.id左连接产品p ON p.company_id = c.id左连接(选择i.id,i.product_id,来自productimage ii的i.path,其中(从productimage iii选择计数(*),其中iii.product_id = ii.product_id和iii.id <= ii.id) <= 1) I) ON i.product_id = p.id,其中company_id =?(未经测试,因为没有提供DDL或DML )。
https://stackoverflow.com/questions/50258168
复制相似问题