2016-03-27 5 views
0

シナリオ:1人のユーザーあたり1日に100アイテムしか処理されないアイテムのキュー。Having句を使用すると、計算フィールドの値がスキップされる

説明:過去24時間の処理済みレコードと未処理アイテムの1日当たりのクォータの自己結合を示します。

SELECT 
    q.*, 
    case when delivery.processed is null then 0 else delivery.processed end as processed, 
    @subcounter := IF(@context = q.user_id, @subcounter+1, 1) as counter, 
    @context := q.user_id as uid 
from queue q 

LEFT JOIN (
    SELECT `user_id`, count(*) as `processed` FROM `queue` 
    where `status` = 'processed' and `updated_at` >= DATE_SUB(NOW(), INTERVAL 24 HOUR) 
    GROUP BY `user_id`) as `delivery` 
    ON `delivery`.`user_id` = `q`.`user_id` 

WHERE 
    `q`.`status` = 'queued' and 
    (`delivery`.`processed` is null or `delivery`.`processed` < 100) 
HAVING 
    `counter` <= (100 - `delivery`.`processed`) 

最終条件counter <= (100 - delivery.processed)カウンタが偶数であるすべての代替の行をスキップする誤りです。によるすべて追いつい番号をスキップし、(第二最後の列欠落しているシーケンス:私はスキップすることはできません。この最後の条件は、それらがここで100

Table: queue 
Columns: 
id bigint(20) UN AI PK 
created_at timestamp 
updated_at timestamp 
job_id bigint(20) 
user_id bigint(20) 
status varchar(64) 

の日々のクォータ制限を超過しようとしているレコードがなければ

は、クエリの結果でありますあなたが持っているものの周りに余分なSELECT - 句条件)

'224244', '2016-03-24 22:44:32', '2016-03-24 22:44:32', '23942', '3', 'queued', '0', '1', '3' 
'224995', '2016-03-24 22:45:25', '2016-03-24 22:45:25', '23963', '3', 'queued', '0', '3', '3' 
'225208', '2016-03-24 22:45:40', '2016-03-24 22:45:40', '23970', '3', 'queued', '0', '5', '3' 
'225316', '2016-03-24 22:45:47', '2016-03-24 22:45:47', '23972', '3', 'queued', '0', '7', '3' 
'227247', '2016-03-27 15:17:00', '2016-03-27 15:17:00', '22741', '3', 'queued', '0', '9', '3' 
'227258', '2016-03-27 15:17:00', '2016-03-27 15:17:00', '22747', '3', 'queued', '0', '11', '3' 
'228291', '2016-03-27 15:18:22', '2016-03-27 15:18:22', '24537', '3', 'queued', '0', '13', '3' 

答えて

0

を持つ私は、あなたが余分な層を必要だと思います。それ以外の場合は、HAVINGを最も外側に移動します。その時点で、WHEREに変更できます。

関連する問題