2015-05-14 2 views
-1

У меня есть таблица, которая содержит:MySql запросов, чтобы выбрать более диапазон дат

line | date | metricName | metricValue 

Я хочу select where date > curDate() - 30 days

-условию является то, что для каждой записи

where metricName = "foo" AND metricName != "bar" (значение метрики никогда не был «баром»).

По существу в течение всего промежутка времени, если metricValue когда-либо делал = «Бар», я не хочу видеть линию.

+0

Что вы пробовали до сих пор ?? –

+0

Похоже, что @ usermecart1923 изменил значение вашего вопроса ('metricValue' =>' metricName'). Пожалуйста, уточните свой пост. –

ответ

0

Это должно исключать из рассмотрения все эти строки. Надеюсь, что line является первичным ключом. Или еще лучше, на что индексируется таблица?

SELECT 
    `line` 
FROM 
    `the_table` 
WHERE 
    `date` > NOW() - 'your interval' AND 
    `metricName` = 'foo' AND 
    `line` NOT IN (
    SELECT DISTINCT `line` FROM `the_table` WHERE `metricName` = 'foo' AND `metricValue` = 'Bar' 
) 
0
SELECT `line` 
    FROM `the_table` 
    WHERE `date` > NOW() - INTERVAL 30 DAY 
     AND `metricName` = 'foo' 
     AND NOT EXISTS 
     (SELECT * 
      FROM `the_table` 
      WHERE `metricName` = 'foo' 
       AND `metricValue` = 'Bar' 
    ); 

Для выполнения вам понадобятся две составные индексы:

INDEX(metricName, date), 
INDEX(metricName, metricValue) 
Смежные вопросы