Получить строку из одной таблицы плюс COUNT из связанной таблицы - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать SQL-запрос, в котором я получаю информацию одной таблицы (WHERE shops.shop_domain = X) вместе с COUNT таблицы клиентов WHERE customers.product_id = 4242451.

Таблица магазинов НЕ содержит 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 голосов
/ 14 ноября 2018

A коррелированный подзапрос должен быть существенно дешевле (и проще) для цели:

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 является числовым типом данных , поэтому я использую числовой литерал (4242451) вместо строкового литерала '4242451' - в противном случае могут возникнуть проблемы.

0 голосов
/ 13 ноября 2018

Вы рядом. Условие 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, если он объявлен как первичный ключ в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...