2017-08-14 86 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 | 
+----+------+-------+