2014-07-15 22 views
1

一個MySQL表被定義爲:查找MySQL表孔,其中ID是不是唯一

CREATE TABLE tbl_misure_30m (
    m_rcd_id   INT NOT NULL AUTO_INCREMENT , 
    m_fon_id   INT UNSIGNED, 
    m_timestamp  TIMESTAMP, 
    m_fon_rcd_id  INT UNSIGNED, 
    m_fon_Leq   FLOAT(4,2), 
    m_fon_LsMax  FLOAT(4,2), 
    m_Leq_state  INT, 
    m_LsMax_state  INT, 
    m_fon_mem_block INT, 

    INDEX fon_key (m_fon_id), 
    FOREIGN KEY (m_fon_id) REFERENCES tbl_users(fon_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 

    PRIMARY KEY (m_rcd_id) 

) ENGINE = InnoDB; 

其中:

  • m_rcd_id是自動增量索引
  • m_fon_id是「我的用戶」ID有幾個m_fon_rcd_id
  • m_fon_rcd_id是相對於每個m_fon_id的記錄ID(因此它們不是唯一的)。

不幸的是,數據庫設計無法更改。

現在,我需要驗證列m_fon_rcd_id(爲每個m_fon_id)不包含洞(在這種情況下,我需要知道範圍)。

我想要的是一個結果集: gap_starts_at | gap_ends_at | m_fon_id |

我發現this answer但它需要是理所當然的各種ID都是唯一的:

SELECT (t1.m_fon_rcd_id + 1) as gap_starts_at, 
     (SELECT MIN(t3.m_fon_rcd_id) -1 FROM tbl_misure_30m t3 WHERE t3.m_fon_rcd_id > t1.m_fon_rcd_id) as gap_ends_at 
FROM tbl_misure_30m t1 
WHERE NOT EXISTS (SELECT t2.m_fon_rcd_id FROM tbl_misure_30m t2 WHERE t2.m_fon_rcd_id = t1.m_fon_rcd_id + 1) 
HAVING gap_ends_at IS NOT NULL 

有什麼建議?

在此先感謝!

回答

1

我會通過獲取下一個值來解決這個問題。然後做一些算術上說:

select m_fon_rcd_id + 1 as gapstart, next_m_fon_rcd_id - 1 as gap_ends, 
     (next_m_fon_rcd_id - m_fon_rcd_id - 1) as gap_length 
from (select m_fon_rcd_id, 
      (select m2.m_fon_rcd_id 
       from tbl_misure_30m m2 
       where m2.m_fon_rcd_id > m.m_fon_rcd_id 
       order by m_fon_rcd_id 
       limit 1 
      ) as next_m_fon_rcd_id 
     from tbl_misure_30m m 
    ) m 
where next_m_fon_rcd_id > m_fon_rcd_id + 1; 

編輯:

如果你想內m_fon_id做到這一點的差距,你可以將其添加到查詢的各個部分:

select m_fon_id, m_fon_rcd_id + 1 as gapstart, next_m_fon_rcd_id - 1 as gap_ends, 
     (next_m_fon_rcd_id - m_fon_rcd_id - 1) as gap_length 
from (select m_fon_rcd_id, 
      (select m2.m_fon_rcd_id 
       from tbl_misure_30m m2 
       where m2.m_fon_id = m.m_fon_id and 
        m2.m_fon_rcd_id > m.m_fon_rcd_id 
       order by m_fon_rcd_id 
       limit 1 
      ) as next_m_fon_rcd_id 
     from tbl_misure_30m m 
    ) m 
where next_m_fon_rcd_id > m_fon_rcd_id + 1; 
+0

謝謝很多爲您的快速答案!我嘗試你的建議,但它給了我奇怪的結果(它似乎沒有考慮到m_fon_id)。例如。我有一個m_fon_id = 123其中MIN(m_fon_rcd_id)= 11145和MAX(m_fon_rcd_id)= 11191之間沒有洞,但我沒有看到這個邊界到結果集。有沒有辦法得到如下結果集:| m_fon_id | gapstart | gap_ends | ? – Barzo

+0

@Barze。 。 。雖然您在括號註釋中提到了「m_fon_id」,但它並不是查詢的一部分。目前還不清楚它應該扮演什麼角色。您應該使用樣本數據和期望的結果編輯您的問題。 –

+0

你是對的,我很抱歉!我沒有這樣想過。再次感謝您的支持!! – Barzo

相關問題