【问题标题】:Select statement with conditions depending on the value of another column - same table (mysql)根据另一列的值选择条件语句 - 同一张表(mysql)
【发布时间】:2022-11-15 10:54:03
【问题描述】:

我有 3 列的表:

ID, 
Cancellation_Policy_Type 
Cancellation_Policy_Hours.

我想获得的查询将允许我选择:

  • 与免费取消对应的最小 Cancellation_Policy_Hours(如果存在)
  • 如果具体ID上面不存在,那我想看看有没有部分退款
  • 如果以上都不存在,则查看是否有No Refundable。

下面的查询不正确,但它可以让我更好地了解我想要实现的目标:

IF (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'Free Cancellation') IS NOT NULL)
THEN (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'Free Cancellation')
ELSEIF (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'Free Cancellation') IS NULL AND (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours  from MYTABLE WHERE Cancellation_Policy_Type = 'Partially Refundable') IS NOT NULL Then (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'Partially Refundable')
ELSEIF (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'Free Cancellation') IS NULL AND (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'Partially Refundable') IS NULL  THEN (SELECT ID, Cancellation_Policy_Type, MIN(Cancellation_Policy_Hours) from MYTABLE WHERE Cancellation_Policy_Type = 'No Refundable') 
END

您将在下面找到我的数据集的示例:

这是包含有关每个 ID 取消政策的所有数据的表格:

下面是期望的结果,这是一个包含其他信息(包括生产)的表格和 2 列,其中每个 ID 重复最佳可用取消政策类型和时间:

谢谢

【问题讨论】:

  • 如果您解释“其他列”来自哪个表以及与 MYTABLE 的关系是什么,将会有所帮助。

标签: mysql


【解决方案1】:

您没有提供足够的信息来帮助您确信这是“正确”的方式,但是(在这里猜测)您可以尝试 -

SELECT
    ID,
    MIN(IF(Cancellation_Policy_Type = 'Free Cancellation', Cancellation_Policy_Hours, NULL)) AS minFreeCancellation,
    MIN(IF(Cancellation_Policy_Type = 'Partially Refundable', Cancellation_Policy_Hours, NULL)) AS minPartiallyRefundable,
    MIN(IF(Cancellation_Policy_Type = 'No Refundable', Cancellation_Policy_Hours, NULL)) AS minNoRefundable
FROM MYTABLE
WHERE ID = ?
GROUP BY ID;

如果您以完整表结构(CREATE 语句)、一些示例数据、一些统计信息和所需结果的形式提供示例,您更有可能获得“正确”答案。上面的条件聚合示例不太可能是最好的方法,但它可能会提供您正在寻找的内容。根据您的数据集,仅运行单独的查询可能是最佳解决方案。

【讨论】:

  • 谢谢@nnichols,我按照你的建议按问题编辑了更多细节。
猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多