【问题标题】:Selecting rows with reference id's to same table from mysql从mysql中选择具有引用ID的行到同一个表
【发布时间】:2010-10-11 13:23:57
【问题描述】:

我有一张桌子,例如:

id 名称 ref_id 订单 data_obj -- ---- ------ ----- -------- 1 Sam 0 15 [二进制数据] 2 Jack 0 20 [二进制数据] 3 苏 0 25 [二进制数据] 4 Sam2 1 - [无数据] 5 Sue2 3 - [无数据] 6 Sam3 1 - [无数据]

这个想法是我有更多的列而不是 data_obj 这可以是常见的,所以我不想再次插入它们,只想插入一个引用 id 到相同的数据。

是否可以写一个查询并选择这个:

1 - Sam - 来自 id 1 的二进制数据 4 - Sam2 - 来自 id 1 的二进制数据 6 - Sam3 - 来自 id 1 的二进制数据 2 - Jack - 来自 id 2 的二进制数据 3 - Sue - 来自 id 3 的二进制数据 5 - Sue2 - 来自 id 3 的二进制数据

请注意,我是根据名为 order 的列进行排序的,对于引用的行,此列没有实际数据。

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    你为什么不用一张以上的桌子?

    CREATE TABLE user (
        user_id number not null (some form of auto increment or sequence),
        name varchar(50) not null,
        otherdata type,
        primary key (id));
    
    CREATE TABLE common (
        common_id number not null (autoinc),
        user_id number not null,
        commondata type,
        primary key (common_id),
        unique index (user_id, common_id));
    
    SELECT u.name, u.otherdata, c.commondata
    FROM user u, common c
    WHERE u.user_id = c.user_id
    
    TABLE user
    user_id  name   otherdata
    1        Sam    abc
    2        Jack   def
    3        Sue    ghi
    
    Table common
    common_id user_id  commondata
    1         1        AAA
    2         1        BBB
    3         1        CCC
    4         2        DDD
    5         3        EEE
    6         3        FFF
    
    Output
    name   otherdata  commondata
    Sam    abc        AAA
    Sam    abc        BBB
    Sam    abc        CCC
    Jack   def        DDD
    Sue    ghi        EEE
    Sue    ghi        FFF
    

    【讨论】:

      【解决方案2】:
      SELECT t1.id, t1.name, t2.data_obj 
      FROM your_table t1
      LEFT JOIN your_table t2 ON t1.ref_id = t2.id
      ORDER BY t1.order
      

      其他版本,不返回没有引用的行

      SELECT t1.id, t1.name, t2.data_obj 
      FROM your_table t1, your_table t2
      WHERE t1.ref_id = t2.id
      ORDER BY t1.order
      

      【讨论】:

      • 这不起作用。没有 ref_id 的行返回 NULL 作为 data_obj。
      • 好吧,你没有具体说明你想要什么。
      【解决方案3】:

      这是对@vartec 的answer 的修改。此修改使用COALESCE() 组合来自主行或引用行的data_obj

      SELECT t1.id, t1.name, COALESCE(t1.data_obj, t2.data_obj) 
      FROM your_table t1
      LEFT JOIN your_table t2 ON t1.ref_id = t2.id
      ORDER BY COALESCE(t1.order, t2.order), ref_id;
      

      COALESCE() 是一个标准 SQL 函数,它返回其第一个非 NULL 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多