MySQL基于条件选择选择

时间:2013-04-26 13:55:52

标签: mysql sql select conditional

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

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`

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

2 个答案:

答案 0 :(得分: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,则引用的值将为null,因此COALESCE将返回“base”值({{ 1}}而不是t.whatever)。

请注意,这假设您的实际行没有reffed.whatever

答案 1 :(得分:0)

我想你只想在left outer join声明中使用select和一些逻辑。

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

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