基本上我将数据存储在MySql 5.5中。我使用qt连接到mysql。我想比较两列,如果col1大于col2,则计数继续,但当col1小于col2时,count结束并退出。所以这是计算列开头某些条件下的行数。在mysql中可以吗?
一个例子:
Col1 Col2
2 1
2 3
2 1
我需要的计数应该返回1,因为第一行符合Col1>的条件。 Col2,但第二行没有。每当条件不符合时,无论下列行是否符合条件,计数都会退出。
答案 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)交叉指针