我可以在脚本中执行此操作,但我知道这在MySQL中很容易实现。您知道银行对账单如何在支票号码旁边放一个小星号吗?这正是我希望能够做到的。
假设一个表包含通常的id
pkey,但也包含checkno
整数。我想返回三列:checkno
,id
和outoforder
,它们将是空白字符串或星号:
SELECT t1.checkno, t1.id, outoforder '' FROM table t1 ORDER BY t1.checkno
如何修改此SQL来执行此操作?我正在考虑像(SELECT t2.id FROM table t2 WHERE t2.checkno = t1.checkno - 1)
这样的子查询,但是抛出了一些MySQL函数。顺便说一句,我在我的实际表上尝试了这种类型的子查询,但查询永远不会返回。
答案 0 :(得分:1)
通过使用这样的变量吗?
SELECT t1.checkno,t1.id,
IF(@lastCheckNo IS NULL OR @lastCheckNo = t1.checkno - 1,'','*') as outoforder,
@lastCheckNo := t1.checkno
FROM (SELECT * FROM `table` ORDER BY checkno) t1,(SELECT @lastCheckNo := NULL)variable
答案 1 :(得分:0)
性能不佳,但它能够处理没有被单个单元分隔的行ID(公式中没有-1
):
SELECT
T.id, T.checkno,
/* T1.id AS PREVIOUS_ID, T1.checkno AS PREVIOUS_CHECK, */
/* T2.id AS NEXT_ID, T2.checkno AS NEXT_CHECK, */
CASE
WHEN T1.checkno > T.checkno THEN '*'
WHEN T2.checkno < T.checkno THEN '*'
ELSE ''
END AS OUT_OF_ORDER
FROM Tab T
LEFT JOIN Tab T1 ON T1.id = (SELECT MAX(S1.id) FROM Tab S1 WHERE T.id > S1.id)
LEFT JOIN Tab T2 ON T2.id = (SELECT MIN(S2.id) FROM Tab S2 WHERE T.id < S2.id)
拥有fiddle。将评论的代码留作解释。