在mysql中,我可以计算满足某些条件的行数,如果没有则退出计数?

时间:2012-02-24 14:23:00

标签: mysql

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

一个例子:

Col1 Col2

2 1

2 3

2 1

我需要的计数应该返回1,因为第一行符合Col1>的条件。 Col2,但第二行没有。每当条件不符合时,无论下列行是否符合条件,计数都会退出。

3 个答案:

答案 0 :(得分:1)

SELECT COUNT(*)
FROM   table
WHERE  col1 > col2

理解您所追求的内容有点困难,但COUNT(*)会返回您的条件匹配的行数,如果这是您的愿望。如果不是,你可以更具体或展示你想要的例子吗?我将尽力根据其他细节更正我的答案。

答案 1 :(得分:0)

这有点难看,但会完成这项工作。它需要根据您想要应用于someTable的任何ORDER等进行调整,但原则是合理的。

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 < col2的行乘以0时,它将继续乘以0 x 1.然后外部查询将它们相加。

这不太理想,但足够了。这可以扩展为允许您在休息之前通过执行以下操作获取这些行

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

答案 2 :(得分:0)

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

SQL是为“基于集合”的逻辑而设计的 - 你真的是在程序逻辑之后。如果你必须这样做,那么

1)使用光标

2)按语句使用

3)交叉指针