Оператор сравнения не работает в запросе MySQL - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть этот запрос MySQL:

SELECT * FROM forex_pair_signals AS SENALES 
JOIN forex_pair_price AS PRECIO 
ON SENALES.forex_pair_price_id = PRECIO.forex_pair_price_id 
JOIN forex_pair AS PARES 
ON PRECIO.forex_pair_id = PARES.forex_pair_id
WHERE 
PRECIO.forex_pair_price_time >= '2019-02-01 00:00' AND
PRECIO.forex_pair_price_time <= '2019-02-07 01:00' AND 
TIME (PRECIO.forex_pair_price_time) BETWEEN '06:00' AND '13:00' AND 
PARES.forex_pair_id = 13 AND SENALES.forex_pair_signals_result = 1 AND
PRECIO.forex_pair_price_rsi >= '80.00' 
OR PRECIO.forex_pair_price_rsi <= '20.00' 
ORDER BY SENALES.forex_pair_signals_id DESC

Этот запрос работает нормально, за исключением случаев, когда добавлен следующий фильтр:

AND PRECIO.forex_pair_price_rsi >= '80.00' OR 
PRECIO.forex_pair_price_rsi <= '20.00'

Проблема в том, что последний фильтр игнорирует все остальные фильтрыи в результате получаем все данные, которые соответствуют последнему фильтру.

Ответы [ 4 ]

0 голосов
/ 09 февраля 2019

Я думаю, что попытался бы привести в порядок запрос, консолидировав ранжированную логику в предложении WHERE.

SELECT *
FROM forex_pair_signals AS senales
INNER JOIN forex_pair_price AS precio ON senales.forex_pair_price_id = precio.forex_pair_price_id 
INNER JOIN forex_pair AS pares ON precio.forex_pair_id = pares.forex_pair_id
WHERE pares.forex_pair_id = 13
  AND senales.forex_pair_signals_result = 1
  AND precio.forex_pair_price_time BETWEEN '2019-02-01 00:00' AND '2019-02-07 01:00' 
  AND precio.forex_pair_price_rsi NOT BETWEEN '20.00' AND '80.00'
  AND TIME(precio.forex_pair_price_time) BETWEEN '06:00' AND '13:00'
ORDER BY senales.forex_pair_signals_id DESC

Ваше окончательное условие предложения WHERE можно переписать как NOT BETWEEN , чтополностью исключает эту проблему.

Я также позволил себе использовать псевдонимы таблиц в нижнем регистре и переставил условия предложения WHERE, чтобы сначала расположить более простые / более легкие условия.

Я думаю, что этот запрос оченьболее поздний.

(ps Старайтесь не использовать * в своих предложениях SELECT; вам следует запрашивать только те данные, которые вы намереваетесь использовать.)

0 голосов
/ 09 февраля 2019

Приоритет оператора Когда вы используете более одного логического оператора в выражении, MySQL оценивает операторы OR после операторов AND.Это называется приоритетом оператора. 1

SELECT true OR false AND false;

Результат

true OR false AND false
-----------------------
1

SELECT (true OR false) AND false;

Результат

(true OR false) AND false
-------------------------
0

, таким образом, для такого случая вам необходимы паратезы

WHERE 
PRECIO.forex_pair_price_time >= '2019-02-01 00:00' AND
PRECIO.forex_pair_price_time <= '2019-02-07 01:00' AND 
TIME (PRECIO.forex_pair_price_time) BETWEEN '06:00' AND '13:00' AND 
PARES.forex_pair_id = 13 AND SENALES.forex_pair_signals_result = 1 AND
(
    PRECIO.forex_pair_price_rsi >= '80.00' OR
    PRECIO.forex_pair_price_rsi <= '20.00' 
)
0 голосов
/ 09 февраля 2019

Вы должны использовать круглые скобки при использовании функции ИЛИ, так как она соответствует одному или двум предложениям WHERE, определенным в ней путем дифференцирования в скобках.

SELECT * FROM forex_pair_signals AS SENALES 
JOIN forex_pair_price AS PRECIO 
ON SENALES.forex_pair_price_id = PRECIO.forex_pair_price_id 
JOIN forex_pair AS PARES 
ON PRECIO.forex_pair_id = PARES.forex_pair_id
WHERE 
PRECIO.forex_pair_price_time >= '2019-02-01 00:00' AND
PRECIO.forex_pair_price_time <= '2019-02-07 01:00' AND 
TIME (PRECIO.forex_pair_price_time) BETWEEN '06:00' AND '13:00' AND 
PARES.forex_pair_id = 13 AND SENALES.forex_pair_signals_result = 1 AND
(PRECIO.forex_pair_price_rsi >= '80.00' 
OR PRECIO.forex_pair_price_rsi <= '20.00') 
ORDER BY SENALES.forex_pair_signals_id DESC;

Спасибо

0 голосов
/ 09 февраля 2019

AND оценивается до OR, поскольку AND имеет более высокий приоритет.Используйте скобки, чтобы переопределить приоритет оператора :

WHERE
    PRECIO.forex_pair_price_time >= '2019-02-01 00:00' AND
    PRECIO.forex_pair_price_time <= '2019-02-07 01:00' AND 
    TIME (PRECIO.forex_pair_price_time) BETWEEN '06:00' AND '13:00' AND 
    PARES.forex_pair_id = 13 AND SENALES.forex_pair_signals_result = 1 AND
    (
        PRECIO.forex_pair_price_rsi >= '80.00' 
        OR
        PRECIO.forex_pair_price_rsi <= '20.00'
    )

Или вы можете переписать ваше условие, чтобы оно представляло собой только одно выражение:

    PRECIO.forex_pair_price_rsi not between '20.01' and '79.99'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...