Question

Puis-je rejoindre en quelque sorte des tables et d'éviter l'utilisation de Distinct dans la requête MySQL suivante. invited_by_id montre l'ID utilisateur de qui a invité cet utilisateur.

SELECT
    user1.id, count(distinct user2.id) AS theCount, count(distinct user3.id) AS theCount2
FROM
    users AS user1
LEFT OUTER JOIN
    users AS user2 ON user2.invited_by_id=user1.id
LEFT OUTER JOIN (
    SELECT id, invited_by_id FROM users WHERE signup_date >= NOW() - INTERVAL 30 DAY
) AS user3 ON user3.invited_by_id=user1.id
GROUP BY user1.id;
Était-ce utile?

La solution

Essayez quelque chose comme ça, je l'ai changé les noms de table sous-requête pour en faire un peu plus clair:

Select
    user.id,
    all_time.total AS theCount, 
    last_month.total AS theCount2
From users AS user
Left Outer Join 
    (Select Count(id) as total, invited_by_id
     From users
     Group By invited_by_id) as all_time
       On all_time.invited_by_id = user.id
Left Outer Join
    (Select Count(id) as total, invited_by_id
     From users 
     Where signup_date >= NOW() - INTERVAL 30 DAY
     Group By invited_by_id) AS last_month 
       On last_month.invited_by_id = user.id

Si cela est quelque chose que vous exécutez souvent, assurez-vous que user.invited_by_id est indexé!

Autres conseils

Je suppose ici que vous essayez d'obtenir un décompte du nombre de fois qu'un utilisateur a été invité et un compte de combien de fois que l'utilisateur a été invité dans les 30 derniers jours.

Dans ce cas, vous pouvez faire la requête avec une simple somme conditionnelle:

select user1.id, count(user2.id) as tehCount, sum(user2.signup_date >= NOW() - INTERVAL 30 DAY) as theCount2
from users as user1
left outer join users as user2 on user2.invited_by_id = user1.id
group by user1.id

Si les valeurs NULL theCount2 sera un problème, utilisez un soudent comme:

coalesce(sum(user2.signup_date >= NOW() - INTERVAL 30 DAY), 0)

Si vous utilisez une version de MySQL supérieure à 5.0.37 vous avez un Profiler à votre disposition qui pourrait vous donner une assez bonne idée de l'endroit où les goulots d'étranglement sont sur toute question. Cela pourrait être un bon départ Point- vous pourriez peut-être modifier la sortie dans la question initiale si vous n'êtes pas sûr de la meilleure façon d'interpréter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top