2011-03-29 247 views
0

假设我有一个ID列的表。MySQL查询帮助?

我想做一个MySQL查询查看表中的所有数据,看它是否满足两个条件之一。如果它符合第一个条件(称为X),那么当下一个条件满足(Y)时,我想要找到ID而没有任何重叠。所以基本上一个模式将合并X然后是Y.

没有重叠意味着例如如果条件X被满足的ID是6并且条件Y被满足的ID是12.我不想要下一个X条件即使存在X条件,也要在6和12之间。

我很困惑如何设置这样的查询。我想我可以使用同一个表的连接,然后有一个where子句来调节第二个id比第一个更大,但这是行不通的。

这本来查询我

SELECT x.id AS 'x_id', x.data AS 'x_data', y.id AS 'y_id', y.data AS 'y_data' 
FROM Table1 AS x, Table1 AS y 
WHERE y.id > x.id AND y.id-x.id >= 5 
AND Y Conditions AND X Conditions 

ID1,其中x是满足,ID 2,其中y遭到了其中的数据是0和1之间。如果条件X(例如X <一些随机数。 5满足,然后我想要ID),那么我需要满足条件Y的以下ID(例如Y> .6)。所以基本上输出是基于两个条件的来自同一个表的两个不同ID。

我想要的图案出现在那里它在X和Y之间的ID去X则Y,则X则Y没有重叠

 
6, Data, 15, Data 
6, Data, 21, Data 
6, Data 23, Data 
6, Data , 27, Data 
9, Data, 15, Data 
9, Data, 21, Data 

理想的情况下,这是我想 id-x data id-y data

结果集的格式

非常感谢帮助。

+0

我也尝试过使用DISINCT作为其中一个ID,但是出现了相同的结果 – evanvee 2011-03-29 20:17:48

+0

@evanvee:建议编辑你的问题,使其清楚地表明你的结果集。如果您包含之前和之后的样本数据,这将有助于说清楚。 – 2011-03-29 21:15:09

+0

@ p.campbell我试图让它更清晰。现在有道理吗? – evanvee 2011-03-29 21:22:16

回答

0

首先着眼于查找所有有效的(X,Y对)模式(重叠):

CREATE VIEW valid AS 
(SELECT x.id AS xid 
     , x.datta AS xdata 
     , (SELECT MIN(y.id) 
      FROM Table1 y 
      WHERE y.id - xid >= 5 
      AND (Y conditions)  --Y conditions here 
     ) AS yid 
     , (SELECT datta 
      FROM Table1 y 
      WHERE y.id = yid 
     ) AS ydata 
    FROM Table1 AS x 
    WHERE (X conditions)  --X conditions here 
); 

(请向):

SELECT * 
FROM valid 
; 

创建发现模式不重叠的程序:

DELIMITER $$ 
CREATE PROCEDURE FindPatterns() 
BEGIN 
    SET @lastgoody := -9999; 
    SET @dummy := FALSE; 

    SELECT xid, xdata, yid, ydata, testy, test FROM 
    (select xid 
      , xdata 
      , yid 
      , ydata 
      , @dummy := IF(q.xid > @lastgoody, TRUE, FALSE) as test 
      , @lastgoody := IF(@dummy, q.yid, @lastgoody) as testy 
     from valid q 
     order by xid 
    ) as p 
    WHERE test ; 
END$$ 
DELIMITER ; 

然后,您可以:

CALL FindPatterns; 
+0

@evanvee:是否按预期工作? – 2011-03-30 18:59:39