Eksik 3 veya daha fazla ardışık kayıtları anlatmak için en iyi yolu

0 Cevap php

Ben bir başarı sistemi uygulayan ediyorum. Ben oluşturmak için çalışıyorum "rozetleri biri" belirleyecektir:

  1. Bir kullanıcı en az bir kodlama meydan katıldı eğer
  2. Sonra 3 ardışık kodlama zorluklar katılmadı
  3. Sonra tekrar katılan başladı.

"Geri döneceğim" ;-) rozeti basitçe denir

The 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          -

Girişleri tabloda "tip" giriş tipi olmayan bir regex tabanlı giriş veya regex tabanlı bir ise ya ifade eder. Bir kullanıcı, bu nedenle meydan 6 yukarıdaki girdi, geçerli bir regex ve non-regex girişini hem de gönderebilirsiniz.

Example output

Bu isterim sorgunun tarzı çıkışı (bu durumda rozeti layık olmalıdır) olan:

(for userid 1)
Challenge 1 --> Joined in
Challenge 2 --> Joined in
Challenge 3 --> NULL
Challenge 4 --> NULL
Challenge 5 --> NULL
Challenge 6 --> Joined in

How?

İşte benim sorular

  1. Nedir bir sorguda bunu yapmanın en iyi yolu nedir?
  2. Bazı PHP başvurmadan bu dizi SELECT MySQL kullanabileceğiniz bir işlevi var mı?

The query so far

Kullanıcı 3 için de katılmadı eğer ben bir SOL DIŞ meydan tablo girişleri ve masa (SOL DIŞ kullanıcı katıldı değil zorlukları korumak için emin olmak için) katılmak için JOIN yapıyorum, sonra sıralama meydan start_date ile görmek veya daha fazla ardışık zorluklar.

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

important edit: mantıklı bu rozeti için kriterler yukarıdaki örnekte çıkışı gibi ie katıldı zorlukları arasında sıkışmış 3 veya daha fazla ardışık zorluklar olması gerekir. Aksi halde ilk kez bir meydan okuma katılır herkes otomatik olarak rozet verilecektir. Kullanıcı bir süre için "uzak" zorluklar katılmaktan olduğu görülmesi gereken (> = 3)

0 Cevap