Pereiti prie turinio

Darbelis SQL išmanančiam žmogui


Rekomenduojami pranešimai

Darau 5 lygių referalų sistemą reikia SQL užklausos ar sprendimo šiai užduočiai:

 

Pirmą dalį padariau, iš šios lentelės atvaizduoju pirmo, antro, trečio, ketvirto ir penkto lygio referalus (pvz mano ID referrer lauke yra 1, referral tai tie kas buvo pakviesti)

 

   id  referrer  referral  points  purchase_date  
------  --------  --------  ------  ---------------
   17        25        29       0  (NULL)         
   16        27        28       0  (NULL)         
   15        26        27       0  (NULL)         
   14        25        26       0  (NULL)         
   13        24        25       0  (NULL)         
   12         1        24       0  (NULL)         

 

Man problemos prasideda antroje dalyje kai reikia sužinoti atvirkščiai, pvz mano 5 lygio referalas (viršutinėje lentelėje tai būtu ID 28), jis atlieka tam tikrus veiksmus po kurių reikia įvykdyti tam tikrą UPDATE grandinę visiems aukščiau einamiems lygiams, pvz pridėti atitinkama kiekį bonus taškų priklausomai nuo lygio, bet čia jau neesminis dalykas ką aš ten darysiu.

 

Programoj tam tikru metu vyksta paslaugų pirkimas kurio metu aš galiu gauti ID perkančio paslaugą perkančio žmogaus, tas ID yra tarkim 28 iš referral lauko, šis veiksmas yra užloginamas papildomai šioje lentelėje (points_history)

 

   id    user  amount  processed  date                 
------  ------  ------  ---------  ---------------------
    1      25      20          0  2015-11-04 12:21:22  
    2      25      20          0  2015-11-04 12:22:04  
    3      26      20          0  2015-11-04 12:22:14  
    4      25      20          0  2015-11-04 13:19:05  

 

Čia matome kad buvo 2 vartotojai (25,26) kurie kažką užsisakė.

 

Idealiausias variantas man būtu parašyti SQL ar procedūra kuri viską padarytu tame žingsnyje kai aš darau INSERT į aukščiau pavaizduotą lentelę (points_history), dar priimtinas variantas būtu tam tikru metu leisti CRON kuris iš šios lentelės apdoroti įrašus kurie processed = 0 (dirbti su users lentele tiesiogiai manau negalima nes vartotojų gali būti labai daug ir paskui prasidės performance bėdos).

 

Biudžetas proto ribose nelimituotas, reikia sprendimo, o ne patarimų.

 

Įdomumo dėlei parašysiu kaip vyksta pirma dalis, čia ištraukiami paskutiniai erferalai 5 lygio kurie priklauso tam vartotojui, trumpai tariant užduotis atvirkščiai padaryti, gauti paskutinio referalo (dabartinio user ID) 4,3,2 ir pirmo lygio pakvietėjus.

 

referrer - pakvietėjas

referral - pakviestasis

 

SELECT 
u.name, u.reg_date, u.email, r5.points, r5.purchase_date 
FROM alo_refs r1 
JOIN alo_refs r2 ON r2.`referrer`= r1.`referral` 
JOIN alo_refs r3 ON r3.`referrer`= r2.`referral` 
JOIN alo_refs r4 ON r4.`referrer`= r3.`referral` 
JOIN alo_refs r5 ON r5.`referrer`= r4.`referral`
JOIN alo_users u ON r5.`referral`= u.`user_id` 
WHERE 
r1.`referrer` = '{$user_id}'

 

Tokių užklausų yra 5 viso atitinkamai pakoreguotos kiekvienam lygiui.

 

ASAP

Redagavo Prodev
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...