Postgresql - три таблицы. Два соединения. Несвязанный результат - PullRequest
0 голосов
/ 10 января 2019

У меня есть три таблицы t_items , market , items_likes .

create table t_items (
item_id varchar PRIMARY KEY,
title varchar);

create table market(
market_id varchar PRIMARY KEY,
item_id varchar references t_items(item_id),
title varchar);

CREATE TABLE items_likes (
like_id varchar PRIMARY KEY,
item_id varchar references t_items(item_id),
user_id varchar);

В конце я хочу получить результат, который включает в себя число лайков и количество рынков .

select
  t_items.item_id,
  t_items.title,
  count(items_likes.item_id) as likes_count,  
  count(market.item_id) as market_count
from market
inner join t_items on market.item_id = t_items.item_id
inner join items_likes on t_items.item_id = items_likes.item_id
group by t_items.item_id;

Но когда я добавляю к запросу число лайков , я теряю результат числа рынков .

Вот рабочий пример: https://rextester.com/live/HVUGW7783

Как сделать запрос с указанием точного количества лайков и магазинов?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете агрегировать по элементам и подсчитывать количество различных рынков, и им нравится устранять проблему с двойными числами, которые вы получили бы в противном случае при объединении трех таблиц, например:

select
  t_items.item_id,
  t_items.title,
  count(distinct items_likes.like_id) as likes_count,  
  count(distinct market.market_id ) as market_count
from market
left join t_items on market.item_id = t_items.item_id
left join items_likes on t_items.item_id = items_likes.item_id
group by t_items.item_id
order by t_items.title;

Левое соединение важно, так что вы все равно получите строку для элемента, который имеет, например, 3 рынка, но 0 лайков. При внутреннем объединении вы получите только предметы, по крайней мере, с одним рынком и, по крайней мере, с одним подобным.

0 голосов
/ 10 января 2019

Присоединяйтесь к 2 запросам, первый получает количество лайков, а второй - количество рынков:

select t_items.item_id, t_items.title, t.likecounter, t.marketcounter from (
  select t.item_id, t.likecounter, tt.marketcounter from (
    select t_items.item_id, count(items_likes.like_id) likecounter
    from t_items inner join items_likes
    on items_likes.item_id = t_items.item_id
    group by t_items.item_id
  ) t inner join (
    select t_items.item_id, count(market.item_id) marketcounter 
    from t_items inner join market 
    on market.item_id = t_items.item_id 
    group by t_items.item_id
  ) tt
  on tt.item_id = t.item_id
) t inner join t_items
on t_items.item_id = t.item_id
order by t_items.item_id

См. Демоверсию

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