2015-02-17 3 views
2

Я пытаюсь вычислить весы для диаграммы, которую мне нужно создать, однако я достиг проблемы, когда данные не упорядочены после даты, и если я закажу ее по дате, она будет сделайте это после того, как я рассчитал баланс, и поэтому баланс по-прежнему не соответствует действительности. Как я могу рассчитать баланс после того, как запрос был заказан к этой дате?Закажите sql-запрос перед выполнением оператора case

http://sqlfiddle.com/#!2/374b9/6

тестовых данных:

CREATE TABLE betting 
    (
    id int auto_increment primary key, 
    date DATETIME, 
    odds varchar(20), 
    status varchar(30) 
    ); 

INSERT INTO betting 
(id, date, odds, status) 
VALUES 
('1', '2015-02-08 20:27:44', '1.70', 'wrong'), 
('2', '2015-02-08 13:22:17', '3.05', 'correct'), 
('3', '2015-02-09 16:40:45', '2.20', 'correct'), 
('4', '2015-02-10 13:58:24', '1.33', 'correct'), 
('5', '2015-02-12 11:37:51', '1.35', 'correct'), 
('6', '2015-02-12 10:24:13', '1.38', 'correct'); 


SET @balance = 0; 
SELECT date, odds, status, CASE WHEN status = 'wrong' 
      THEN @balance := @balance -100 
      ELSE @balance := @balance + (odds * 100 - 100) 
      END as balance 
from betting 

Желаемая баланс

205 
105 
225 
258 
293 
331 

я создал SQLFiddle для упрощая.


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Поскольку существует некоторая путаница, я решил добавить реальный запрос, который немного больше из-за того, что это WordPress.

SET @balance = 0; 
    SELECT odds.meta_value AS odds, stat.meta_value AS stats, posts.post_date, 
     CASE WHEN stat.meta_value = 'wrong' 
     THEN @balance := @balance -100 
     ELSE @balance := @balance + (odds.meta_value * 100 - 100) 
     END as balance 
       FROM wp_t3a673_posts posts 
       LEFT JOIN wp_t3a673_postmeta stat ON posts.ID = stat.post_id 
       AND stat.meta_key = 'status' 
       LEFT JOIN wp_t3a673_postmeta odds ON posts.ID = odds.post_id 
       AND odds.meta_key = 'odds' 
       LEFT JOIN wp_t3a673_term_relationships tr ON posts.ID = tr.object_id 
       LEFT JOIN wp_t3a673_term_taxonomy t ON tr.term_taxonomy_id = t.term_taxonomy_id 
       WHERE (
       stat.meta_value = 'correct' 
       OR stat.meta_value = 'wrong' 
       ) 
       AND posts.post_status = 'publish' 
       AND t.taxonomy = 'category' 
       AND (
       t.term_id =4 
       OR t.term_id =5 
       OR t.term_id =6 
       ) 
     ORDER BY posts.post_date 

В результате этого ниже. Здесь вы можете ясно видеть, что первый баланс не является правильным: оно должно быть -100, но возвращает 105, и это связано с тем, что он заказывает после баланс рассчитывается следующим образом:

enter image description here

И если я просто -100 в любом случае, если это неправильно или правильно, вы даже можете ясно видеть проблему

enter image description here

+0

ли идентификатор 2 не должна быть после того, как идентификатор 1? –

+1

+1 для обеспечения скрипки сразу. Но каков был бы желаемый результат здесь, можете ли вы это показать? Я попытался поставить внешний SELECT вокруг нашего запроса и упорядочить по дате в этом, но это дает разные значения для баланса. Можете ли вы объяснить еще, что такое значение должно представлять? – CBroe

+0

первые две строки вашего снимка противоположны тем, что находятся в вашем наборе данных. 1.70 в 13:22 и 3.05 в 20:27. Какой из них мы должны использовать? – Adam

ответ

0

Проблема, вероятно, в том, что из-за объединений переменные оцениваются на более раннем этапе.

Попробуйте вставить основной запрос заставляя MySQL оценить переменные в конце:

SET @balance = 0; 
SELECT *, 
    CASE WHEN stats = 'wrong' 
    THEN @balance := @balance -100 
    ELSE @balance := @balance + (odds * 100 - 100) 
    END as balance 
    FROM (SELECT odds.meta_value AS odds, stat.meta_value AS stats, posts.post_date 
      FROM wp_t3a673_posts posts 
      LEFT JOIN wp_t3a673_postmeta stat ON posts.ID = stat.post_id 
      AND stat.meta_key = 'status' 
      LEFT JOIN wp_t3a673_postmeta odds ON posts.ID = odds.post_id 
      AND odds.meta_key = 'odds' 
      LEFT JOIN wp_t3a673_term_relationships tr ON posts.ID = tr.object_id 
      LEFT JOIN wp_t3a673_term_taxonomy t ON tr.term_taxonomy_id = t.term_taxonomy_id 
      WHERE (
      stat.meta_value = 'correct' 
      OR stat.meta_value = 'wrong' 
      ) 
      AND posts.post_status = 'publish' 
      AND t.taxonomy = 'category' 
      AND (
      t.term_id =4 
      OR t.term_id =5 
      OR t.term_id =6 
      ) 
    ORDER BY posts.post_date 
    ) tt 
+0

Я отредактировал этот ответ на основе дополнительной информации, надеюсь, что это поможет. –

0

Я не понимаю ... это что?

SET @balance:=0; 
    SELECT date, odds, status, 
     @balance:[email protected]+IF(status='wrong', 0, odds*100)-100 as balance 
    FROM betting 
    ORDER BY date; 
+0

Да, но он рассчитает баланс, а затем после заказа по дате, а затем цифры будут в неправильном порядке –

+0

, но он соответствует желаемому балансу в вашем последнем выпуске. я не понимаю вашу проблему ... – Adam

+0

Я добавил информацию под жирным шрифтом «EXTRA INFO» –

Смежные вопросы