2012-06-19 32 views
0

我不确定这是甚至可能的,但我知道如果是这样,stackoverflow社区是我可以找到答案的地方。我基本上试图预先处理一些数据,以便加快我的应用程序。这里是什么,我试图做一个例子:在MySQL中使用动态SQL(具有查询结果的子查询)

SELECT id 
FROM data AS data1 
WHERE rangeVal < (SELECT rangeVal FROM data WHERE id = data1.id - 1) 
AND actiondate >= '1980-05-18' 
AND actiondate <= '2012-05-18' 
ORDER BY actiondate DESC 

本质上讲,我试图让我的数据的ID只有在其rangeVal小于rangeVal从第二天开始。

任何帮助或点在正确的方向将不胜感激!

+0

您的查询似乎是正确的;你可以使用'BETWEEN'1980-05-18'和'2012-05-18',但引擎应该足够好为你做。你测试了你的查询吗?怎么了? – Marco

+0

你用这个查询得到的结果是什么(这看起来似乎是正确的)? –

+0

只是为了阐明为什么我删除了Dynamic-SQL标签......动态SQL是动态构建SQL命令的地方。如引入新的JOIN或WHERE子句。该问题中的示例查询仅使用相关的子查询*(子查询的结果与外部查询相关)*。 – MatBailie

回答

1

如果您的日子是增量式的,并且您每天都有一行,而不是尝试依赖从增量id中减去,这会由于行删除和其他问题而非常不可靠,您可以使用表在DATE_SUB()DATE_ADD()连接条件:

SELECT 
    id 
FROM 
    data data_today 
    /* JOIN on a date manipulation */ 
    JOIN data data_tomorrow ON DATE_ADD(data_today.actiondate, INTERVAL 1 DAY) = data_tomorrow.action_date 
WHERE 
    data_today.rangeVal < data_tomorrow.rangeval 
    AND data_today.actiondate BETWEEN '1980-05-18' AND '2012-05-18' 
0

子查询也蛮好

SELECT id 
FROM data AS data1 
WHERE rangeVal < 
    (
    SELECT rangeVal FROM data d2 WHERE d2.id = data1.id AND d2.actiondate= 
    DATE_ADD(d2.action_date, INTERVAL 1 DAY) 
    ) 
AND actiondate BETWEEN '1980-05-18' AND '2012-05-18' 
ORDER BY actiondate DESC