Je suis en train de mettre en place un système de réalisation. L'un des « badges » Je suis en train de créer déterminera:La meilleure façon de dire 3 enregistrements consécutifs ou plus manquants
- Si un utilisateur a rejoint dans au moins un codage défi
- Ensuite n'a pas rejoint dans 3 défis de codage consécutifs
- a ensuite commencé participer à nouveau.
Le badge est simplement appelé "Je serai de retour" ;-)
Les tables
users
==================
id fullname
1 Gary Green
challenge
==================================
id name start_date
1 challenge1 01-AUG-2010
2 challenge2 03-AUG-2010
3 challenge3 06-SEP-2010
4 challenge4 07-SEP-2010
5 challenge5 30-OCT-2010
6 challenge6 05-NOV-2010
entries
====================================================
id challengeid userid type code
1 1 1 1 -
2 2 1 1 -
3 6 1 1 -
4 6 1 2 -
Le "type" dans le tableau des entrées se réfère à si le type d'entrée est soit une entrée non-regex, soit une base regex. Un utilisateur peut soumettre à la fois une entrée regex et une expression non-regex, donc l'entrée ci-dessus pour le challenge 6 est valide.
Exemple sortie
Ceci est la sortie de style de la requête que je voudrais (dans ce cas, le badge doit être attribué):
(for userid 1)
Challenge 1 --> Joined in
Challenge 2 --> Joined in
Challenge 3 --> NULL
Challenge 4 --> NULL
Challenge 5 --> NULL
Challenge 6 --> Joined in
Comment?
Voici mes questions
- Quelle est la meilleure façon de le faire dans une requête?
- Y at-il une fonction que je peux utiliser dans MySQL pour sélectionner cette plage sans avoir recours à du PHP?
La requête jusqu'à présent
Je fais LEFT OUTER JOIN pour se joindre à la table des défis et des entrées de table (LEFT OUTER pour vous assurer de préserver les défis auxquels l'utilisateur n'a pas rejoint in), puis trier par challenge start_date pour voir si l'utilisateur n'a pas participé depuis au moins 3 défis consécutifs.
SELECT challenge.id AS challenge_id, entries.id AS entry_id
FROM challenge_entries entries
LEFT OUTER JOIN challenge_details challenge
ON entries.challengeid = challenge.id
WHERE entries.userid = <user_id>
ORDER BY challenge.start_date
GROUP BY entries.challengeid
modifier importante: pour ce badge de comprendre les critères devront être 3 ou plus des défis consécutifs pris en sandwich entre les défis qui se sont joints à savoir comme la sortie d'exemple ci-dessus. Sinon, toute personne qui participe à un défi pour la première fois recevra automatiquement le badge. L'utilisateur doit être considéré avoir été « loin » de participer à des défis pendant un certain temps (> = 3)
Merci pour votre inscription. Cela semble corriger la requête, mais je ne peux pas obtenir les entrées GROUP BY.challengeid' fonctionne, il ne produit rien. –
Pourquoi faites-vous un groupe par sur challengeid sur la table des entrées, ne pouvez-vous pas faire un groupe par sur l'ID de la table de défi? Dans ton cas Group par challenge.id – Kennethvr
Oh idiot moi j'ai eu mon groupe légèrement mélangé, merci de le regrouper parfaitement maintenant. Ma dernière question est 2. Y a-t-il un bon moyen de vérifier s'il y a 3 NULL pris en sandwich entre deux défis? J'ai pensé à convertir les données en une seule chaîne puis faire une vérification de regex de chaîne comme/(\ d +) (NULL) {3} (\ d +)/semble le meilleur pari? –