Mysql 如果最后一行的值正确,则运行查询
我只想在最后一行中的值正确时运行查询。在我的示例中,如果最后一行ColumnA中的值是1,那么我想运行MyQuery。但是如果值不是1,就停在那里,什么也不做 我尝试了case和count(*)以及If exists。但我总是出错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 =
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。我得找个更好的办法来解决这个问题。