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

Mysql 如果最后一行的值正确,则运行查询,mysql,mariadb,Mysql,Mariadb,我只想在最后一行中的值正确时运行查询。在我的示例中,如果最后一行ColumnA中的值是1,那么我想运行MyQuery。但是如果值不是1,就停在那里,什么也不做 我尝试了case和count(*)以及If exists。但我总是出错 SELECT CASE WHEN ((SELECT COUNT(*) FROM (Select a.* from table as a order by a.index desc limit 1) as b where b.ColumnA =

我只想在最后一行中的值正确时运行查询。在我的示例中,如果最后一行ColumnA中的值是1,那么我想运行MyQuery。但是如果值不是1,就停在那里,什么也不做

我尝试了case和count(*)以及If exists。但我总是出错

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,但它也不起作用

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。MyQuery有点慢,大多数行都不需要运行它。

我认为我们可以在这里重新表述您的逻辑,使其按您的意愿运行:

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,并将应用于查询的潜在结果集中的所有记录。也就是说,如果“last”记录中的
ColumnA
值为1,那么您将返回整个结果集,否则它将是空集

假设您的MariaDB版本既不支持
行号
也不支持CTEs,则使用:

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

我认为我们可以在这里重新表述您的逻辑,使其按照您的意愿工作:

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,并将应用于查询的潜在结果集中的所有记录。也就是说,如果“last”记录中的
ColumnA
值为1,那么您将返回整个结果集,否则它将是空集

假设您的MariaDB版本既不支持
行号
也不支持CTEs,则使用:

(your query here)
WHERE (SELECT ColumnA FROM yourTable ORDER BY index DESC LIMIT 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
注:

可以简化(并加速)到


请注意,这是一个真/假“表达式”,因此它可以在不同的位置使用。

这取决于您的查询是什么

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
注:

可以简化(并加速)到


请注意,这是一个正确/错误的“表达式”,因此它可以在不同的地方使用。

我很遗憾地提到,我使用的是mariadb 10.1版,10.2版中引入了Row_Number()。我必须考虑更新,但现在我想避免更新。@No666我编辑我的答案是为了给你一些应该适用于你的MariaDB版本的东西。我编辑了我的问题。我不想过滤MyQuery的结果,而是阻止MyQuery在不需要它的行上运行。我不想提及我使用的是mariadb 10.1版,10.2版中引入了row_Number()。我必须考虑更新,但现在我想避免更新。@No666我编辑我的答案是为了给你一些应该适用于你的MariaDB版本的东西。我编辑了我的问题。我不是想过滤MyQuery的结果,而是阻止MyQuery在不需要它的行上运行。只有在存储的例程中才允许使用
IF
语句。(否则你必须在你的应用程序代码中这样做。)我明白我的逻辑是错误的。我不能在任何查询下运行任何查询,也不能使用select而不是IF。我必须找到更好的方法来实现这一点。只有在存储例程中才允许使用
IF
语句。(否则你必须在你的应用程序代码中这样做。)我明白我的逻辑是错误的。我不能在任何查询下运行任何查询,也不能使用select而不是IF。我得找个更好的办法来解决这个问题。