2015-05-14 157 views
-1

的我有一個表,其中包含:MySQL查詢選擇了日期範圍

line | date | metricName | metricValue 

我想 select where date > curDate() - 30 days

-condition是,每個記錄

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)