2011-03-29 220 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