【问题标题】:Create a mysql routine cursor with a select in a select在选择中创建一个带有选择的mysql例程游标
【发布时间】:2015-03-20 14:28:54
【问题描述】:

我有一张如下表:

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) 仅当同一个“gnome”之前没有“dead”=“yes”时,“dead”为“no”的行。

结果应该是:

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

【问题讨论】:

  • 您特别想为此使用光标?
  • 到目前为止你做的代码在哪里?
  • @WorkSmarter 刚刚粘贴了我正在处理的小提琴。我想如果这适用于选择,它也应该适用于光标

标签: mysql select if-statement


【解决方案1】:

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

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 行?

【讨论】:

  • 酷,谢谢...我想我只需要按 id 订购,它应该是完美的。你能解释一下我的解决方案会在哪里失败吗?只是为了更好地理解
  • 你想要一件事或另一件事。您的查询似乎返回 BOTH。更具代表性的数据集可能更好地说明问题。
  • mmm 仍然没有得到它,你能说明在哪种情况下它会失败?无论如何,我会使用你的解决方案!谢谢
  • 在您的编辑中,我需要第 1、4、5、7、8、9、10 行,两种解决方案看起来都返回相同
  • 好吧,也许我弄错了。
【解决方案2】:

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

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')

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

你怎么看?在常规游标中应该可以吗?

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 2012-09-21
    • 2011-06-02
    • 2014-01-02
    • 2020-04-04
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多