我正在尝试建立一个SQL查询,在其中获取一个表的信息(WHERE shops.shop_domain = X
)和客户表WHERE customers.product_id = 4242451
的COUNT个。
商店表中没有product.id
,但是客户表中没有shop_domain
,因此我尝试进行某种联接。
我本质上想返回以下内容:
这是我对查询的尝试不是那么可爱。 我想我的想法是正确的(也许...),但我无法全神贯注于构建此查询。
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
答案 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_id
是numeric data type,所以我使用numeric literal(4242451
)代替字符串文字'4242451'
-否则可能会引起问题。