【问题标题】:select when record change value选择何时记录变化值
【发布时间】:2014-05-06 18:50:22
【问题描述】:

我正在尝试仅选择与以前的记录相比值发生变化的记录,

我的桌子是这样的

Id(int) | value(boolean) |
-------------------------
1       | 0              |
-------------------------
2       | 1              |
-------------------------
3       | 1              |
-------------------------
4       | 1              |
-------------------------
5       | 0              |
-------------------------
6       | 0              |
-------------------------

我必须得到 id:2,5

感谢您的帮助

【问题讨论】:

  • 继续 - 尝试一些东西,任何东西。并且 id 总是递增的

标签: mysql select triggers


【解决方案1】:

你可以在查询中使用mysql变量来检查它是新的还是不变的

SELECT
`Id`, 
`value`,
(CASE when @test=value then 'unchanged'
else 'changed' end) occurance,
@test:=`value`  testvar
FROM
  Table1 
,(SELECT @test:='new') t
HAVING occurance='changed'
ORDER BY `Id`

See fiddle demo

【讨论】:

  • 这确实应该有一个 ORDER BY 子句。
【解决方案2】:

我进行了自加入,但不是加入相同的ids,而是加入t1.id = t2.id-1,然后比较值:

select t2.id 
from thetable t1
inner join thetable t2 on t1.id = t2.id-1
where t1.value != t2.value

sqlfiddle:http://sqlfiddle.com/#!2/6d626/4

编辑添加: 感谢@Ravinder,我想出了一种方法来做到这一点,即使 id 不是连续的。 我用this related question

SET @a :=0;
SET @b :=1;
SELECT t1.id, t1.rownum
FROM
(SELECT if(@a, @a:=@a+1, @a:=1) as rownum, id, value FROM thetable) AS t1
LEFT JOIN
(SELECT if(@b, @b:=@b+1, @b:=1) as rownum, id, value FROM thetable) AS t2
ON t1.rownum = t2.rownum
where t2.value != t1.value

SQLFiddle with non-sequential ids

基本上,如果您没有顺序 ID,则可以创建自己的 ID。我称它们为rownum。

【讨论】:

  • 这个主意不错。让我们希望 id 是按顺序存储的,并且中间没有记录被删除或更改。
  • @Ravinder 在这种情况下它仍然可以工作,假设所需的功能是只显示顺序 id 之间的变化:sqlfiddle.com/#!2/1c4c5b/1 ...但如果在我的示例中询问者想要返回 9 的差异.. . 没那么多。
  • @Ravinder,我也想出了一个非顺序情况的解决方案。
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2021-08-07
  • 2012-01-13
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多