【问题标题】:mySQL select from different rows same tablemySQL 从同一张表的不同行中选择
【发布时间】:2015-06-14 03:56:44
【问题描述】:

假设我有下表:

|   ID   |   col1_fix   |   col2   |  col3   |   ref_ID  
    1        val1       val12     val13  
    2        val2       val22     val23        1
    3        val3       val32     val33      

我应该使用什么语句输出到:(行 id=2 具有 ref_id = 1 所以不是获取其值,而是从行 id=1 获取值,但我想保留来自行 id= 的 col1_fix 值2,所以这一行最终只会从行 id = 1 获取 col2 和 col3 值)

|   ID   |   col1_fix   |   col2   |  col3   |     
    1        val1       val12     val13  
    2        val2       val12     val13        
    3        val3       val32     val33      

我正在考虑创建一个视图,以便它加入自己的表,不确定方向是否正确)。

【问题讨论】:

  • 那么,如果它包含 2 行或更多行,这就是您想要的? 100 万行你想要前 2 个加倍排序,然后是 999998?
  • 听起来像一个简单的SELF OUTER JOINCASE
  • 我想获得相同的行数。但是,如果该行有一个 ref_id,而不是从一行中选择值,那么它将选择(部分)具有 id = ref_id 的其他行。所以如果有 100 万行,输出将是 100 万行
  • 如果第 1 行的 ref_ID 为 3,在您的示例中会发生什么?您是否需要遵循任意长的参考链?您的问题未详细说明,您需要考虑所有可能性并决定每种情况的所需内容。
  • 实际上它们是一个“组”的一部分(还有其他ID用于跟踪但我没有列出)并且只能有一个唯一的ref_ID,因此不会有引用链。很抱歉造成混乱。

标签: mysql sql heidisql


【解决方案1】:
create table t1
(
id int not null auto_increment primary key,
col1 int not null,
col2 int not null,
col3 int not null,
ref_id int null
);

insert t1 (col1,col2,col3,ref_id) values (1,2,3,null);
insert t1 (col1,col2,col3,ref_id) values (222,223,224,null);
insert t1 (col1,col2,col3,ref_id) values (333,334,335,null);
insert t1 (col1,col2,col3,ref_id) values (444,445,446,null);
insert t1 (col1,col2,col3,ref_id) values (555,556,557,3);
insert t1 (col1,col2,col3,ref_id) values (666,667,668,2);

select one.id,
( case when one.ref_id is null then one.col1 else two.col1 end
) as col1,
( case when one.ref_id is null then one.col2 else two.col2 end
) as col2,
( case when one.ref_id is null then one.col3 else two.col3 end
) as col3
from t1 one
left join t1 two
on two.id=one.ref_id

【讨论】:

    【解决方案2】:
    select curr.id,
           curr.col1_fix,
           case when other.id is null then curr.col2 else other.col2 end as col2,
           case when other.id is null then curr.col3 else other.col3 end as col3
    from the_table as curr
    left join the_table as other
              on other.id = curr.ref_id;
    

    但是,我同意 Jim Garrison 的评论,即您没有指定如果 ref_id 值指向的行本身具有指向另一行的 ref_id 值,等等,等等第四……

    上述查询并未尝试处理这种情况。如果您需要处理这种递归要求,那么,我的理解是,您将很难使用 MySql,因为它缺少一些基本的递归功能。虽然我确信,如果需要,比我更聪明的人可以向我们展示这仍然是可行的。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2015-08-25
      相关资源
      最近更新 更多