代码之家  ›  专栏  ›  技术社区  ›  Guerrilla

将两个用户操作表合并到一个结果中

  •  0
  • Guerrilla  · 技术社区  · 2 年前

    我有这个数据库

    CREATE TABLE user_auth_custom (
      id serial,
      name VARCHAR ( 255 )
    );
    
    CREATE TABLE payment_action (
      id serial,
      user_auth_custom_id integer,
      message VARCHAR ( 255 )
    );
    
    CREATE TABLE work_action (
      id serial,
      user_auth_custom_id integer,
      message VARCHAR ( 255 )
    );
    
    INSERT INTO user_auth_custom VALUES
        (1, 'borris'),
        (2, 'jeremy'),
        (3, 'joe'),
        (4, 'barry');
    
    INSERT INTO payment_action VALUES
        (1, 1, 'Paid $20'),
        (2, 1, 'Paid $340'),
        (3, 1, 'Paid $12'),
        (4, 2, 'Paid $120');
        
    INSERT INTO work_action VALUES
        (1, 1, 'Submitted work abc'),
        (2, 1, 'did stuff'),
        (3, 1, 'more things'),
        (4, 1, 'loafing about'),
        (5, 1, 'dancing'),
        (6, 1, 'push ups'),
        (7, 1, 'monwalk'),
        (8, 2, 'balanced books'),
        (9, 2, 'read mind');
    

    用户1(borris)有3个付款操作和7个工作操作。

    我想以这种格式返回10个结果:

    用户Id 消息 动作类型
    1. 付了20美元 付款
    1. 做了些什么 工作

    我的想法是将付款和工作表都加入到客户记录中。我认为这将生成10条记录,其中工作或付款字段为空。然后我可以检查/合并得到结果。比如:

    select u.id user_id, COALESCE (wa.message, pa.message, '') message,
           case
               when pa.id is not null then 'Payment'
               when wa.id is not null then 'Work'
           end action_type
    from user_auth_custom u
        LEFT JOIN work_action wa ON u.id = wa.user_auth_custom_id
        LEFT JOIN payment_action pa ON u.id = pa.user_auth_custom_id
    where (pa.id != null or wa.id != null)
    and.id = 1
    

    但它的行为不像我想象的那样。

    以我要求的格式获取数据的正确方法是什么?

    1 回复  |  直到 2 年前
        1
  •  1
  •   D-Shih    2 年前

    如果我理解正确,你可以尝试使用 UNION ALL 子查询而不是 OUTER JOIN

    SELECT t1.*
    FROM user_auth_custom u
    LEFT JOIN 
    (
      SELECT user_auth_custom_id UserId,message,'Payment' ActionType
      FROM payment_action 
      UNION ALL
      SELECT user_auth_custom_id UserId,message,'Work'
      FROM work_action
    ) t1
    ON u.id = t1.UserId
    WHERE u.id = 1
    

    但如果不需要从中获取列或筛选数据 user_auth_custom ,我们可以使用 联合所有 直接子查询

    SELECT t1.*
    FROM 
    (
      SELECT user_auth_custom_id UserId,message,'Payment' ActionType
      FROM payment_action 
      UNION ALL
      SELECT user_auth_custom_id UserId,message,'Work'
      FROM work_action
    ) t1
    WHERE UserId = 1
    

    sqlfiddle