我有一个类似于以下的数据库......
ID ! Value
...
654 ! Blue
656 ! Green
659 ! Blue
665 ! Blue
...
我有一个数字主键的值。我想要执行一个查询来提取与模式匹配的上一个和下一个主键。
例如,我有ID 659,我想做类似
的事情SELECT NEXT, PREV FROM TABLE WHERE VALUE = 'Blue';
我试图有效地做而不是拿整张桌子。
答案 0 :(得分:4)
1行2列:
SELECT
(SELECT ID FROM test WHERE ID < 659 AND Value = 'Blue' ORDER BY ID DESC LIMIT 1) AS PREV,
(SELECT ID FROM test WHERE ID > 659 AND Value = 'Blue' ORDER BY ID ASC LIMIT 1) AS NEXT;
2行1列:
(SELECT ID AS PREV FROM test WHERE ID < 659 AND Value = 'Blue' ORDER BY ID DESC LIMIT 1)
UNION
(SELECT ID AS NEXT FROM test WHERE ID > 659 AND Value = 'Blue' ORDER BY ID ASC LIMIT 1);
答案 1 :(得分:2)
DROP TABLE IF EXISTS T;
CREATE TABLE T (ID INT PRIMARY KEY,VAL VARCHAR(10));
INSERT INTO T (ID,VAL) VALUES (654,'BLUE'),(656,'GREEN'),(659,'BLUE'),(665,'BLUE');
SELECT CURRENT.ID CURRENTID,CURRENT.VAL,
(SELECT MIN(ID) FROM T NEXT WHERE NEXT.ID > CURRENT.ID AND NEXT.VAL = CURRENT.VAL) NEXT,
(SELECT MAX(ID) FROM T PREV WHERE PREV.ID < CURRENT.ID AND PREV.VAL = CURRENT.VAL) PREV
FROM T CURRENT;
+-----------+-------+------+------+
| CURRENTID | VAL | NEXT | PREV |
+-----------+-------+------+------+
| 654 | BLUE | 659 | NULL |
| 656 | GREEN | NULL | NULL |
| 659 | BLUE | 665 | 654 |
| 665 | BLUE | NULL | 659 |
+-----------+-------+------+------+
4 rows in set (0.00 sec)
或不那么优雅(不能说性能)
SELECT CURRENT.ID CURRENTID,CURRENT.VAL,
NEXT.ID NEXTID,PREV.ID PREVID
FROM
(
SELECT T.ID, T.VAL, IF(T.VAL<>@P,@RN:=1,@RN:=@RN+1) RN, @P:=T.VAL
FROM T,(SELECT @RN:=0,@P:=0) R
ORDER BY T.VAL,T.ID
) CURRENT
LEFT JOIN
(
SELECT T.ID, T.VAL, IF(T.VAL<>@P1,@RN1:=1,@RN1:=@RN1+1) RN1, @P1:=T.VAL
FROM T,(SELECT @RN1:=0,@P1:=0) R1
ORDER BY T.VAL,T.ID
) NEXT ON NEXT.VAL = CURRENT.VAL AND NEXT.RN1 = CURRENT.RN + 1
LEFT JOIN
(
SELECT T.ID, T.VAL, IF(T.VAL<>@P2,@RN2:=1,@RN2:=@RN2+1) RN2, @P2:=T.VAL
FROM T,(SELECT @RN2:=0,@P2:=0) R2
ORDER BY T.VAL,T.ID
) PREV ON PREV.VAL = CURRENT.VAL AND PREV.RN2 = CURRENT.RN - 1
;
+-----------+-------+--------+--------+
| CURRENTID | VAL | NEXTID | PREVID |
+-----------+-------+--------+--------+
| 654 | BLUE | 659 | NULL |
| 659 | BLUE | 665 | 654 |
| 665 | BLUE | NULL | 659 |
| 656 | GREEN | NULL | NULL |
+-----------+-------+--------+--------+
4 rows in set (0.00 sec)