MYSQL ГРУППА ПО ЛЕВОМУ СОЕДИНЕНИЮ И СЧЕТУ - PullRequest
0 голосов
/ 31 января 2020

У меня проблема с группировкой и подсчетом элементов в базе данных MYSQL с предложением JOIN

Две мои таблицы:

таблица пользователей

id | surname | othernames
1  |  Doe    | John
2  |  Doe    | Jane
3  |  Doe    | Mary

таблица подписок

id | user_id | parent_subscription_id 
1  | 1       | Null
2  | 2       | 1
3  | 3       | 1
4  | 4       | 2                         
5  | 5       | 3
6  | 6       | 3

Мне нужно иметь возможность составить список следующим образом

Name         |   Referrals
John Doe     | 2
Jane Doe     | 1
Mary Doe     | 2

Другими словами, это таблица пользователей в user.id, которая соответствует подпискам .user_id, у которого есть подписка с subscription.id, которая является родительской подпиской для другой подписки. Это означает, что если на вашу подписку ссылается другая подписка как на свою собственную parent_subscription_id, то эта новая подписка становится вашим рефералом.

Я пробовал следующий запрос, и он не дает ожидаемых результатов

SELECT users.surname, users.othernames,count('s.parent_subscription_id') as referrals 
FROM users 
    LEFT JOIN subscriptions s ON s.user_id=users.id 
group BY parent_subscription_id

Я проверил некоторые другие вопросы по SO, но я не смог найти ни одного, который решал бы этот тип проблемы. Спасибо

Ответы [ 5 ]

1 голос
/ 31 января 2020

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

SELECT 
    -- Get all users
    users.surname, 
    users.othernames,
    IFNULL(reff.cnt, 0) as referrals -- Preset 0 for users have not referrals in joined table
FROM users
-- Join calculation result
LEFT JOIN (
    -- Calculate count by user
    SELECT parent_subscription_id, COUNT(*) AS cnt
    FROM subscriptions
    GROUP BY subscriptions.parent_subscription_id
) reff on reff.parent_subscription_id = users.id;
1 голос
/ 31 января 2020

Я думаю, что логин c, который вы хотите:

select u.surname, u.othernames, count(s.parent_subscription_id) referrals
from subscriptions s
left join subscriptions p on p.id = s.parent_subscription_id
inner join users u on u.id = coalesce(p.user_id, s.user_id)
group by u.id, u.surname, u.othernames

Демонстрация на DB Fiddle :

surname | othernames | referrals
:------ | :--------- | --------:
Doe     | John       |         2
Doe     | Jane       |         1
Doe     | Mary       |         2
0 голосов
/ 02 февраля 2020

Этот запрос в итоге дал мне результат, который я искал

SELECT u.surname,u.othernames,s1.id,s1.parent_subscription_id, 
s1.refcode, IFNULL(count(s2.parent_subscription_id),0) as referrals 
FROM `subscriptions` s1 left join subscriptions s2 
on s1.id=s2.parent_subscription_id 
LEFT JOIN users u ON u.id=s1.user_id
GROUP by s1.id

Спасибо всем за ваше руководство и поддержку по этому вопросу. Я глубоко ценю это

0 голосов
/ 31 января 2020

вам нужно сгруппировать по идентификатору таблицы пользователей, потому что вам нужно получить счетчик для каждого пользователя, и здесь ваша основная таблица - это пользователи. попробуй вот так.

SELECT users.surname, users.othernames, count('s.parent_subscription_id') as referrals 
FROM users 
LEFT JOIN subscriptions s ON s.user_id = users.id 
group BY users.id
0 голосов
/ 31 января 2020

Изменить группу по полям с помощью users.surname, users.othernames

SELECT users.surname, users.othernames,count(s.parent_subscription_id) as referrals 
FROM users 
    LEFT JOIN subscriptions s ON s.user_id=users.id 
group BY users.surname, users.othernames
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...