【问题标题】:MySQL Select Based on Conditional SelectMySQL 基于条件选择的选择
【发布时间】:2013-04-20 17:40:41
【问题描述】:

我已经设置了我的结构,以便任何条目都可以包含对另一个条目的引用以填写缺失的详细信息。

ID,  NAME, DESCRIPTION, REFERENCE
0,  Stuff,      Things, -1
1,       ,            , 0
2, Things,       Stuff, -1

我希望能够返回表的所有结果,如果一个条目需要引用另一个条目来完成数据,则用数据填充引用字段。我还想保留引用字段的原始 ID。我还希望保留不需要引用的字段。

SELECT `ID`, `REFERENCE` FROM `details` as `t`
     IF `REFERENCE` != -1 THEN
          SELECT *, `t`.`REFERENCE` as `ORIGINAL_ID` FROM `details` WHERE `ID` = `t`.`REFERENCE`
     ELSE
          SELECT * FROM `details` WHERE `ID` = `t`.`ID`

显然这行不通,但我只是想向你展示我认为我想要的东西。这可能吗?感谢阅读。

【问题讨论】:

    标签: mysql sql select conditional


    【解决方案1】:

    你可以接近这样的东西:

    SELECT
        t.ID,
        t.Reference,
        COALESCE(reffed.Name, t.name) AS name,
        COALESCE(reffed.whatever, t.whatever) AS whatever,
        COALESCE(... and so on ...)
      FROM details t
      LEFT OUTER JOIN details reffed ON t.Reference = reffed.id
    

    如果有一个引用值,由于COALESCE,它将优先于“基础”值。

    如果Reference = -1Reference 没有指向有效的id,则引用的值将为空,因此COALESCE 将返回“基本”值(t.whatever 而不是reffed.whatever)。

    请注意,这假设您没有实际的行,其中details.id = -1

    【讨论】:

      【解决方案2】:

      我认为您只需要 left outer joinselect 语句中的一些逻辑。

      以下代码添加了两个新列。这些合并了它们从引用的行(如果有的话)然后从原始数据中提取的逻辑:

      select d.*,
             (case when Reference >= 0 then dref.name else d.name end) as UsedName,
             (case when Reference >= 0 then dref.description else d.description end) as UsedDescription
      from details d left outer join
           details dref
           on d.reference = dref.id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        相关资源
        最近更新 更多