2010-11-10 10 views
4

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

  1. Si un utilisateur a rejoint dans au moins un codage défi
  2. Ensuite n'a pas rejoint dans 3 défis de codage consécutifs
  3. 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

  1. Quelle est la meilleure façon de le faire dans une requête?
  2. 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)

Répondre

1

Je pense que vous devez utiliser l'autre table pour commencer à partir de ...

SELECT challenge.id AS challenge_id, entries.id AS entry_id FROM challenge_details challenge
LEFT JOIN challenge_entries entries ON entries.challengeid = challenge.id and entries.userid = <user_id>
ORDER BY challenge.start_date

en ajoutant un groupe par peut être fait comme vous voulez ...

+0

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. –

+0

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

+0

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? –