代码之家  ›  专栏  ›  技术社区  ›  Sergey Kozlov

PostgreSQL现有的类似于其他用户

  •  3
  • Sergey Kozlov  · 技术社区  · 7 年前

    我有三张桌子: 用户, 项目。 喜欢。

    CREATE TABLE t_users (
    user_id varchar PRIMARY KEY,
    name varchar
    );
    
    CREATE TABLE t_items (
    item_id varchar PRIMARY KEY,
    owner_id varchar
    );
    
    CREATE TABLE t_likes (
    like_id varchar PRIMARY KEY,
    item_id varchar references t_items(item_id),
    user_id varchar references t_users(user_id)
    );
    
    INSERT INTO t_users VALUES ('us123', 'us123');
    INSERT INTO t_users VALUES ('us456', 'us456');
    INSERT INTO t_users VALUES ('us789', 'us789');
    
    INSERT INTO t_items VALUES ('it123', 'us123');
    INSERT INTO t_items VALUES ('it456', 'us123');
    INSERT INTO t_items VALUES ('it789', 'us123');
    INSERT INTO t_items VALUES ('it987', 'us456');
    INSERT INTO t_items VALUES ('it654', 'us456');
    INSERT INTO t_items VALUES ('it321', 'us456');
    
    INSERT INTO t_likes VALUES ('lk123', 'it123', 'us789');
    INSERT INTO t_likes VALUES ('lk456', 'it456', 'us123');
    INSERT INTO t_likes VALUES ('lk789', 'it789', 'us789');
    INSERT INTO t_likes VALUES ('lk987', 'it987', 'us456');
    INSERT INTO t_likes VALUES ('lk654', 'it654', 'us789');
    INSERT INTO t_likes VALUES ('lk321', 'it321', 'us789');
    
    select * from t_items where owner_id = 'us123';
    

    如何发出请求 项目 属于 用户 ,考虑到 现有的喜欢 属于 其他用户 'US789' ?

    Worked example

    我需要结果:

       item_id  owner_id  its_like
    1   it123   us123   us789
    2   it456   us123
    3   it789   us123   us789
    

    谢谢您。

    1 回复  |  直到 7 年前
        1
  •  1
  •   klin    7 年前

    使用左连接。将其他用户ID放入联接条件:

    select i.item_id, i.owner_id, l.user_id as its_like
    from t_items i
    left join t_likes l
    on i.item_id = l.item_id and l.user_id = 'us789'
    where owner_id = 'us123';
    
     item_id | owner_id | its_like 
    ---------+----------+----------
     it123   | us123    | us789
     it456   | us123    | 
     it789   | us123    | us789
    (3 rows)