2017-08-14 84 views
0

有沒有辦法來篩選結果如下:的MySQL結果集過濾問題

數據集:

ID   NAME   VALUE 
----------------------------------------- 
23   Test   TRUE 
24   Test   FALSE 
25   Test   FALSE 
26   Test   TRUE 
27   Test   FALSE 
28   Test   FALSE 

的結果應該是:

ID   NAME   VALUE 
----------------------------------------- 
23   Test   TRUE 
24   Test   FALSE 
26   Test   TRUE 
27   Test   FALSE 

的想法是返回所有行時,有真值和第一行後,有真正

+0

你必須這樣做,在代碼級別 – kranthi

+0

會不會有永遠是真後假值?或者可能會有兩個真實的彼此 – RealCheeseLord

+0

@kranthi爲什麼? – Strawberry

回答

0

可能是假的價值只能用重新加入表相同的表,只能用這個SQL的問題是,它需要有非破ID

數據

id name value 
1  TEST 1 
2  TEST 0 
3  TEST 0 
4  TEST 0 
5  TEST 1 
6  TEST 1 
7  TEST 0 
8  TEST 0 
9  TEST 1 

加入基於從下一行ID和相同的表,然後從表中的所有行值true/1或當前行t1.value=0和以前t2.value = 1

SELECT t1.* FROM table as t1 
LEFT JOIN table t2 ON t1.id = t2.id + 1 
WHERE ((t1.value = 1) OR (t1.value = 0 AND t2.value = 1)) 
ORDER BY t1.id 

結果

id name value 
1  TEST 1 
2  TEST 0 
5  TEST 1 
6  TEST 1 
7  TEST 0 
9  TEST 1 

編輯:我最後的機會了,雖然不知道性能,但noncontinous ID與此

SELECT * FROM my_table as t1 
LEFT JOIN my_table t2 ON 
t2.id = (
    SELECT MAX(my_table.id) FROM my_table 
    WHERE my_table.id < t1.id ORDER BY id asc LIMIT 1 
) 
WHERE (t1.value=1) OR (t1.value=0 AND t2.value=1) order by t1.id asc 
+0

不可能在我的情況下,因爲身份證不是「不制動」的ID,我有ID 3,8,22等結果:(: –

+0

下一次你可以寫關於這些結果身份證問題,他們不連續:) @ShpetimShala –

0

我想這可能與自身來完成工作的加盟,像:

SELECT ID, NAME, VALUE 
    FROM table 
    WHERE VALUE = "TRUE" 
UNION ALL 
    SELECT t2.ID, t2.NAME, t2.VALUE 
    FROM table t1 
    JOIN table t2 
     ON t1.ID +1 = t2.ID 
     AND t1.VALUE = "TRUE" 
     AND t2.VALUE = "FALSE" 

編輯:這也只適用於不間斷的ID,s Ø不可用於有機磷農藥的情況下

+0

「ON t1.ID +1 = t2.ID」在我的情況下,這部分不會工作,ID的未未制動 –

+0

@ShpetimShala可你'CREATE'臨時表?如果是的話,你可以創建自己的連續ID表和使用我的或Mareks代碼 – RealCheeseLord

0

例如爲:

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,name VARCHAR(12) NOT NULL 
,value TINYINT NOT NULL 
); 

INSERT INTO my_table VALUES 
(23,'Test',TRUE), 
(24,'Test',FALSE), 
(25,'Test',FALSE), 
(26,'Test',TRUE), 
(27,'Test',FALSE), 
(28,'Test',FALSE); 

SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT x.* 
      , MIN(y.id) minid 
     FROM my_table x 
     JOIN my_table y 
      ON y.id > x.id 
      AND y.value = FALSE 
     WHERE x.value = TRUE 
     GROUP 
      BY x.id 
    ) b 
    ON a.id IN (b.id,b.minid); 
+----+------+-------+ 
| id | name | value | 
+----+------+-------+ 
| 23 | Test |  1 | 
| 24 | Test |  0 | 
| 26 | Test |  1 | 
| 27 | Test |  0 | 
+----+------+-------+