如果最后一行的值正确,则运行查询

时间:2019-01-16 16:27:59

标签: mysql mariadb

Id仅在最后一行的值正确时才喜欢运行查询。在我的例子中,如果ColumnA的值在最后一行为1,则我想运行MyQuery。但是,如果该值不为1,则在此停下来,不执行任何操作。

我尝试使用case和count(*)以及If是否存在。但我不断出错

SELECT CASE WHEN ((SELECT COUNT(*) FROM
    (Select a.* from table as a order by a.index desc limit 1) as b
        where b.ColumnA = 1)) > 0 )
THEN (MyQuery)
END

我也尝试过是否存在

if exists Select b.* from (Select a.* from table as a order by a.index desc limit 1) where b.ColumnA = 1
begin 
(MyQuery)
end

您能指出这些查询有什么问题吗,或者也许有一种更好的方法可以实现这一目标。

编辑。该查询将在该表中的每次插入之后在触发器上运行,目的是避免在不需要该行的行上运行MyQuery。 MyQuery有点慢,大多数行都不需要它来运行。

2 个答案:

答案 0 :(得分:2)

我认为我们可以在此处重新定义您的逻辑,以使其按需工作:

WITH cte AS (
    SELECT ColumnA, ROW_NUMBER() OVER (ORDER BY index DESC) rn
    FROM yourTable
)

(your query here)
WHERE (SELECT ColumnA FROM cte WHERE rn = 1) = 1;

上面的WHERE子句将返回true或false,并将应用于您查询中潜在结果集中的所有记录。也就是说,如果来自“最后一个”记录的ColumnA值为1,则您将取回整个结果集,否则它将为空集。

假设您的MariaDB版本既不支持ROW_NUMBER,也不支持CTE,请使用:

(your query here)
WHERE (SELECT ColumnA FROM yourTable ORDER BY index DESC LIMIT 1) = 1;

答案 1 :(得分:1)

这取决于您的查询是什么。

INSERT ...
    SELECT ... WHERE ...  -- this could lead to zero rows being inserted

DELETE ...
    WHERE NOT EXISTS ( SELECT ... )  -- this could lead to zero rows being deleted

UPDATE t1 JOIN t2 ...  -- the JOIN may cause no rows to be updated

注意:

(Select a.* from table as a order by a.index desc limit 1) as b
    where b.ColumnA = 1)) > 0 )

可以简化(并加快)为

( ( SELECT ColumnA FROM table ORDER BY index DESC LIMIT 1 ) = 1 )

请注意,这是对/错的“表达式”,因此可以在各种地方使用。