Я бы использовал такой запрос:
SELECT
*
FROM
users AS u0
JOIN
(
SELECT
u1.REFERRAL AS agg,
COUNT(u1.REFERRAL) AS total
FROM
users AS u1
GROUP BY
u1.REFERRAL
ORDER BY total DESC
) AS u2
ON
u2.agg = u0.AFF_ID
Подзапрос позволяет вам, снова объединяясь с таблицей, извлекать данные о реальных пользователях, с которыми группируется AFF_ID.Это даст вам такие вещи, как их FIRST_NAME и т. Д. Где, если вы не присоединитесь снова, вы не получите этот материал.
Он также создает меньшую временную (в памяти) таблицу, чем если бы вы делали это натот же уровень (возможно, мне придется копаться в этом с объяснением больше).
Попробуйте сами
Если вы хотите сделать это всего за один месяц, мы можем изменить подзапрос, чтобы подсчитывать только пользователей, добавленных в этом месяце:
SELECT
*
FROM
users AS u0
JOIN
(
SELECT
u1.REFERRAL AS agg,
COUNT(u1.REFERRAL) AS total
FROM
users AS u1
WHERE
YEAR(u1.sigmup_date) = YEAR(NOW())
AND
MONTH(u1.sigmup_date) = MONTH(NOW())
GROUP BY
u1.REFERRAL
ORDER BY total DESC
) AS u2
ON
u2.agg = u0.AFF_ID
Наконец, вам, возможно, придется использовать LEFT JOIN, если вы хотите, чтобы пользователи не ссылались ни на кого.
Например
И если вы добавите что-то вроде
WHERE
u2.agg IS NULL
В конце внешнего запроса вы можете найти всех пользователей без рефералов,
Например
Любая оптимизация в стороне, лучше (для меня) это сделать как подзапрос.
Последний, есливам не нравится NULL для всего, что вы можете использовать COALESCE()
, чтобы исправить это следующим образом:
SELECT
u0.*, COALESCE(u2.total,0) AS total
FROM
users AS u0
LEFT JOIN
(
SELECT
u1.REFERRAL AS agg,
COUNT(u1.REFERRAL) AS total
FROM
users AS u1
GROUP BY
u1.REFERRAL
ORDER BY total DESC
) AS u2
ON
u2.agg = u0.AFF_ID
DBFiddle
А теперь это 0's
Я считаю COALESCE
очень полезным и чем меньше работы, которую вы должны выполнять в коде, тем проще будет.Если вы можете отформатировать данные так, как вы хотите, из БД, то обычно лучше манипулировать ими позже.Может быть разница между использованием чего-то вроде fetchAll
и необходимостью зацикливать его и изменять его в PHP, прежде чем вы сможете его использовать.
Cheers!