【问题标题】:SELECT FROM table with conditional SELECT check带有条件 SELECT 检查的 SELECT FROM 表
【发布时间】:2018-11-29 12:24:31
【问题描述】:

我有一个表foo 有以下两列。 reference_uid 可以与 type CREATE 和 DELETE 相同。

+======================================================+
|  reference_uid                         |    type     | 
+======================================================+
| 180f28e3-6abd-45a8-b84c-410e908e62ed   | CREATE      | 
| 180f28e3-6abd-45a8-b84c-410e908e62ed   | DELETE      | 
+------------------------------------------------------+

下面的查询将两行都返回给我;

SELECT type FROM foo WHERE `reference_uid` = '180f28e3-6abd-45a8-b84c-410e908e62ed';

但我想要这样的查询只返回一行。如果 type = DELETE 的行存在,则返回 DELETE 类型的行,否则返回 CREATE 类型的行(注意 type=CREATE 的行将始终存在)。

我想我需要在 SELECT 语句中创建 SELECT 吗? 我的失败尝试是;

 SELECT type FROM foo WHERE type IN (SELECT type FROM foo WHERE `reference_uid` = '180f28e3-6abd-45a8-b84c-410e908e62ed') WHERE type = "DELETE";

【问题讨论】:

  • 当您说“列”时,您的意思似乎是“行”?
  • 谢谢...更正:)

标签: mysql sql select where-in


【解决方案1】:

您也可以使用ORDER BYLIMIT 的简单组合:

SELECT *
FROM `foo`
WHERE `reference_uid` = '180f28e3-6abd-45a8-b84c-410e908e62ed'
ORDER BY `type` DESC LIMIT 1

【讨论】:

    【解决方案2】:

    我们可以试试这个:

    SELECT
        reference_uid,
        MAX(type) AS max_type
    FROM foo
    WHERE reference_uid = '180f28e3-6abd-45a8-b84c-410e908e62ed'
    GROUP BY
        reference_uid;
    

    这是有效的,因为文本 DELETE 在字典上大于 CREATE,因此假设 DELETE 存在,前者将优先于后者。如果DELETE 不存在,那么默认情况下它只会选择CREATE

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2019-07-22
      • 1970-01-01
      • 2018-08-18
      • 2022-01-22
      相关资源
      最近更新 更多