0

これを使用して、年齢に基づいてイベントに値を割り当てようとしています:

SELECT u.iduser, timeIsImportant
FROM user AS u
LEFT OUTER JOIN(
SELECT action, user_id, action_time, 
    (IF(bb.action_time < DATE_SUB(CURDATE(), INTERVAL 7 DAY), 
      (CASE 
       WHEN bb.action_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 3 MONTH) AND CURDATE() THEN 0.1 
       WHEN bb.action_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 MONTH) AND CURDATE() THEN 0.2
       WHEN bb.action_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 12 MONTH) AND CURDATE() THEN 0.4
       WHEN bb.action_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 18 MONTH) AND CURDATE() THEN 0.7
       WHEN bb.action_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 24 MONTH) AND CURDATE() THEN 1.0
       END), 0)) 
AS timeIsImportant
FROM bigbrother AS bb
ORDER BY bigbrother.uid DESC LIMIT 1) 
AS bbb 
ON
bbb.user_id = u.iduser AND bbb.action = "C"
WHERE u.iduser = 2;

bigbrother テーブルの古い「イベント」は、ランキング クエリの計算から異なる値を差し引く必要があるという考え方です。上記のクエリの timeIsImportant 値は、次の例では agePoints になります。

サンプルデータ:

     row1                              row2
 -------------                    -------------
 rank: 4.7                         rank 4.9
 agePoints: 0.1                    agePoints 0.4
 timedRank: (rank-AgePoints)       timedRank: (rank-AgePoints)

 -------------------------------------------------------------

 SQL: ORDER BY timedRank DESC

 row1, row2

 SQL: ORDER BY timedRank ASC

 row2, row1

イベント age に基づいて値を割り当てる別の方法があるのではないかと思います。検索結果をランク付けするためにページの読み込みごとにこの計算を行っており、このコードが検索クエリ内にネストされていると全体的なパフォーマンスが低下することがわかったからです。

4

0 に答える 0