在 select 中创建一个带有 select 的 mysql 例程游标

Create a mysql routine cursor with a select in a select

我有一个 table 如下所示:

id  gnome   dead
-----------------
1    pet    yes 
2    pet    no
3    pet    no
4    kin    no
5    kin    yes
6    kin    no

现在,我想在例程中创建一个游标:

1) "dead" 为 "yes" 的所有行;

2) 仅当没有 "dead" = "yes" 之前相同的 "gnome" 时 "dead" 为 "no" 的行。

结果应该是:

id  gnome   dead
-----------------
1    pet    yes 
4    kin    no
5    kin    yes

好的,我想我找到了解决办法

SELECT * FROM asd AS t WHERE dead = 'yes' OR NOT EXISTS(SELECT k.dead FROM asd as k WHERE k.id < t.id AND t.gnome = k.gnome and k.dead = 'yes')

我在这里创建了一个 fiddle: http://sqlfiddle.com/#!9/bc0cd/8/0

你怎么看?在常规游标中应该没问题吗?

您的解决方案似乎不符合您的要求。这是一个解决方案:

SELECT * 
  FROM my_table 
 WHERE dead = 'yes'
 UNION
SELECT x.* 
  FROM my_table x 
  LEFT
  JOIN my_table y 
    ON y.gnome = x.gnome 
   AND y.dead = 'yes' 
   AND y.id < x.id 
 WHERE x.dead = 'no'
   AND y.id IS NULL;

关于您的查询与我的查询之间的差异,请考虑以下几点:

SELECT * FROM my_table;
+----+-------+------+
| id | gnome | dead |
+----+-------+------+
|  1 | pet   | yes  |
|  2 | pet   | no   |
|  3 | pet   | no   |
|  4 | kin   | no   |
|  5 | kin   | yes  |
|  6 | kin   | no   |
|  7 | cat   | no   |
|  8 | cat   | yes  |
|  9 | uno   | no   |
| 10 | uyes  | yes  |
+----+-------+------+

是否要返回第 9 行?