变量在表中重复多少次?

问题描述

我试图弄清楚如何创建一个查询,以在一个值更改之前连续提取一个值重复多少次。我的目标是计算“是”列在达到“否”之前重复的次数。我想要最大的重复计数“是”。

例如,如果我有如下表格

+------+-------+-------+
| Id   | Name  | Blue  |
+------+-------+-------+
| 1    | Sam   | yes   |
| 2    | Mike  | yes   |
| 3    | Carol | yes   |
| 4    | Bob   | yes   |
| 5    | John  | yes   |
| 6    | Adam  | no    |
| 7    | David | yes   |
| 8    | Maria | no    |
+------+-------+-------+

我想要的是一个查询,该查询会重复拉出“ blue = yes”的所有行。再次尝试计算“ blue = yes”所在行的行数。所以结果应该是这样。

+------+-------+-------+
| Id   | Name  | Blue  |
+------+-------+-------+
| 1    | Sam   | yes   |
| 2    | Mike  | yes   |
| 3    | Carol | yes   |
| 4    | Bob   | yes   |
| 5    | John  | yes   |
+------+-------+-------+

我以为我可以做到

SELECT * where blue = "yes" and id = id + 1

但是不会返回任何数据。我只是无法弄清楚正确拉出查询的逻辑。我做了一些研究,并认为临时表查询可能会起作用,但是不确定如何执行此操作。谢谢您的帮助!

解决方法

可能不是最好的方法,但似乎可行:

SET @count=(SELECT count(*) FROM test);

SET @get_count=(SELECT count(CASE WHEN
  @count >= id AND NOT blue="yes" THEN @count:=id END)
    FROM test ORDER BY id ASC);

SELECT * FROM test WHERE id < @count ORDER BY id ASC;

设置一个等于记录数的变量。通过id升序循环浏览记录。 NOT blue="yes"首次将@count设置为id。此后,大小写将始终为false,因为剩余的id将始终大于@count。然后只需运行查询,选择小于@count的id。

,

查询的第一部分从子查询中提取所有信息。 WHERE子句采用子查询的ID,并确保先前ID和当前ID中的Blue为“是”。 OR可以确保不会丢失单个参考点(没有OR的情况下,您将丢失第一个值)。

http://sqlfiddle.com/#!9/af4674/1

CREATE TABLE TableA (
id INT(12),Name VARCHAR(30),Blue VARCHAR(30)
);


INSERT INTO TableA (id,Name,Blue) VALUES
(1,"Sam","yes"),(2,"Mike",(3,"Carol",(4,"Bob",(5,"John",(6,"Adam","no"),(7,"David",(8,"Maria","no");

SELECT   id,Blue 
FROM     (
           SELECT   id,Blue
           FROM     TableA 
          ) t
WHERE    ( 
           SELECT   Blue 
           FROM     TableA 
           WHERE    id = (select min(id) FROM TableA WHERE id > t.id)
          ) = "yes" 
          AND
          ( 
           SELECT   Blue 
           FROM     TableA 
           WHERE    id = t.id
          ) = "yes" 
           OR       (
                     SELECT    Blue 
                     FROM      TableA 
                     WHERE    id = (select max(id) FROM TableA WHERE id < t.id)
                    ) = "yes" 
           AND      (
                     SELECT   Blue 
                     FROM     TableA 
                     WHERE    id = t.id
                    ) = "yes"