在mysql中,我可以计算满足某个条件的行数吗?如果不满足,则退出计算?

在mysql中,我可以计算满足某个条件的行数吗?如果不满足,则退出计算?,mysql,Mysql,基本上我在MySql 5.5中存储数据。我使用qt连接到mysql。我想比较两列,如果col1大于col2,则计数继续,但当col1小于col2时,计数结束并退出。这是为了计算在某种条件下,在列的开头有多少行。在mysql中可能吗 例如: Col1 Col2 2.1 2 3 2.1 我需要的计数应该返回1,因为第一行满足Col1>Col2的条件,但第二行不满足。当条件不满足时,无论后续行是否满足条件,计数都将退出 SELECT COUNT(*) FROM table WHERE col1

基本上我在MySql 5.5中存储数据。我使用qt连接到mysql。我想比较两列,如果col1大于col2,则计数继续,但当col1小于col2时,计数结束并退出。这是为了计算在某种条件下,在列的开头有多少行。在mysql中可能吗

例如:

Col1 Col2

2.1

2 3

2.1

我需要的计数应该返回1,因为第一行满足Col1>Col2的条件,但第二行不满足。当条件不满足时,无论后续行是否满足条件,计数都将退出

SELECT COUNT(*)
FROM   table
WHERE  col1 > col2
很难理解您想要的是什么,但是COUNT*将返回与您的条件匹配的行数,如果您愿意的话。如果不是,你能更具体一点或者举例说明你的目标吗?我将根据其他细节尽力更正我的答案


很难理解您想要的是什么,但是COUNT*将返回与您的条件匹配的行数,如果您愿意的话。如果不是,你能更具体一点或者举例说明你的目标吗?我会根据其他细节尽力更正我的答案。

这有点难看,但可以完成。它需要根据任何顺序等进行调整,你想应用到某个表上,但原则是合理的

SELECT COUNT(*) 
FROM (
    SELECT
        @multiplier:=@multiplier*IF(t.`col1`<t.`col2`,0,1) AS counter
    FROM `someTable` t, (SELECT @multiplier := 1) v
    HAVING counter = 1
) scanQuery
@multiplier变量将继续将自身乘以1。当它遇到col1 这并不理想,但已经足够了。通过执行以下操作,可以扩展它以允许您在中断之前获取这些行

SELECT 
    `someTable`.*
FROM `someTable`
INNER JOIN (
    SELECT
        `someTable`.`PrimaryKeyField`
        @multiplier:=@multiplier*IF(`col1`<`col2`,0,1) AS counter
    FROM `someTable` t, (SELECT @multiplier := 1) v
    HAVING counter = 1
) t
ON scanQuery.`PrimaryKeyField` = `someTable`.`PrimaryKeyField`
或者可能只是

    SELECT
        `someTable`.*
        @multiplier:=@multiplier*IF(`col1`<`col2`,0,1) AS counter
    FROM `someTable` t, (SELECT @multiplier := 1) v
    HAVING counter = 1

这有点难看,但可以胜任。它需要根据任何顺序等进行调整,你想应用到某个表上,但原则是合理的

SELECT COUNT(*) 
FROM (
    SELECT
        @multiplier:=@multiplier*IF(t.`col1`<t.`col2`,0,1) AS counter
    FROM `someTable` t, (SELECT @multiplier := 1) v
    HAVING counter = 1
) scanQuery
@multiplier变量将继续将自身乘以1。当它遇到col1 这并不理想,但已经足够了。通过执行以下操作,可以扩展它以允许您在中断之前获取这些行

SELECT 
    `someTable`.*
FROM `someTable`
INNER JOIN (
    SELECT
        `someTable`.`PrimaryKeyField`
        @multiplier:=@multiplier*IF(`col1`<`col2`,0,1) AS counter
    FROM `someTable` t, (SELECT @multiplier := 1) v
    HAVING counter = 1
) t
ON scanQuery.`PrimaryKeyField` = `someTable`.`PrimaryKeyField`
或者可能只是

    SELECT
        `someTable`.*
        @multiplier:=@multiplier*IF(`col1`<`col2`,0,1) AS counter
    FROM `someTable` t, (SELECT @multiplier := 1) v
    HAVING counter = 1

您不应该为此使用SQL;您得到的任何答案都将充满压缩,例如,如果由于创建或更改索引,初始查询的结果集以不同的顺序返回,那么它们将失败

SQL是为基于集合的逻辑而设计的,而您真正追求的是过程逻辑。如果你必须这样做,那么

1使用光标

2使用ORDERBY语句


3个交叉手指

您不应该为此使用SQL;您得到的任何答案都将充满压缩,例如,如果由于创建或更改索引,初始查询的结果集以不同的顺序返回,那么它们将失败

SQL是为基于集合的逻辑而设计的,而您真正追求的是过程逻辑。如果你必须这样做,那么

1使用光标

2使用ORDERBY语句


3十指交叉

你想施加什么条件之王?就像我说的,col1>Col2如果你能提供关于表结构的信息,最好是你已经尝试过的信息/样本数据,那么我相信你会得到更好的答案你想施加什么条件之王?就像我说的,col1>col2如果您可以提供有关表结构的信息,最好是您已经尝试过的内容/示例数据,那么我相信您会得到更好的答案如果col1然后在Qt下进行计算,并将结果返回数据库,这会花费更多的时间吗?谢谢你的想法。这太棒了!另一个问题,也许与这个问题无关:我在MySQL下做这类实现更好,还是我应该在C++中更好地实现它?因为我在Qt中建立连接,并使用Qt获取数据,所以现在我也在Qt下编写mysql命令。我想我的选择之一是您的解决方案,这很好,另一个解决方案是将这两列存储在内存中,并使用C语言获得这种计数,然后将结果返回到数据库。哪一个更有效?感谢您的帮助。如果不花时间检查卷/结构中涉及的数据类型,就很难真正分类。如果C++上有一个COL1、COL2键,那么这里的子查询应该非常快,所以我希望这两个MySQL修剪结果比传输整个数据集更快。任何关于哪个更有效的具体建议都超出了简单Q+a的范围,因为它取决于数据量/结构和预期用途。另外,最好由在其他领域有经验的人来回答。谢谢你的想法。这太棒了!另一个问题,也许与这个问题无关:我在MySQL下做这类实现更好,还是我应该在C++中更好地实现它?因为我在Qt中建立连接,并使用Qt获取数据,所以现在我也在Qt下编写mysql命令。我想我的选择之一是您的解决方案,这很好,另一个解决方案是将这两列存储在内存中,并使用C语言获得这种计数,然后将结果返回到数据库。哪一个更有效?感谢您的帮助。如果不花时间检查卷/结构中涉及的数据类型,就很难真正分类。如果C++上有一个COL1、COL2键,那么这里的子查询应该非常快,所以我希望这两个MySQL修剪结果比传输整个数据集更快。任何关于哪个更有效的具体建议都超出了简单Q+a的范围,因为它取决于数据量/结构和预期用途。另外,最好由在其他领域有经验的人来回答。