从一个表中获取行,从相关表中获取COUNT

时间:2018-11-13 19:26:06

标签: sql database postgresql

我正在尝试建立一个SQL查询,在其中获取一个表的信息(WHERE shops.shop_domain = X)和客户表WHERE customers.product_id = 4242451的COUNT个。

商店表中没有product.id,但是客户表中没有shop_domain,因此我尝试进行某种联接。

我本质上想返回以下内容:

  • shops.id
  • shops.name
  • shops.shop_domain
  • 客户数量的客户。product_id='4242451'

这是我对查询的尝试不是那么可爱。 我想我的想法是正确的(也许...),但我无法全神贯注于构建此查询。

SELECT shops.id, shops.name, shops.shop_domain, COUNT(customers.customer_id) 
FROM shops 
LEFT JOIN customers ON shops.shop_domain = customers.shop_domain 
WHERE shops.shop_domain = 'myshop.com' AND 
      customers.product_id = '4242451' 
GROUP BY shops.shop_id

相关的数据库架构:

shops:
id, name, shop_domain

customers: 
id, name, product_id, shop_domain

2 个答案:

答案 0 :(得分:1)

您很近。 customers上的条件需要放在ON子句中,因为这是一个LEFT JOIN,而customers是第二个表:

SELECT s.id, s.name, s.shop_domain, COUNT(c.customer_id)
FROM shops s LEFT JOIN
     customers c
     ON s.shop_domain = c.shop_domain AND c.product_id = '4242451'
WHERE s.shop_domain = 'myshop.com'
GROUP BY s.id, s.name, s.shop_domain;

我也倾向于在GROUP BY中包括所有三列,尽管Postgres(和ANSI / ISO标准)只对id很满意(如果它被声明为表中的主键)。

答案 1 :(得分:1)

相关子查询应相对便宜得多(并且更简单):

SELECT id, name, shop_domain
     , (SELECT count(*)
        FROM   customers
        WHERE  shop_domain = s.shop_domain
        AND    product_id = 4242451) AS special_count
FROM   shops s
WHERE  shop_domain = 'myshop.com';

这样,您只需要在子查询中进行聚合,而不必担心会对外部查询产生不希望的影响。

假设product_idnumeric data type,所以我使用numeric literal4242451)代替字符串文字'4242451'-否则可能会引起问题。