【问题标题】:mysql join show all records in left table with a flag for matching records in right tablemysql join 显示左表中的所有记录,并带有一个用于匹配右表中记录的标志
【发布时间】:2012-08-09 17:36:55
【问题描述】:

我需要 mySQL Join 表的帮助,它应该列出“表 A”中的所有用户,并且还应该通过匹配“表 B”中的记录来显示标志

Table A (users)
=====================
id | name 
=====================
1  | aaa 
2  | bbb 
3  | ccc 
4  | ddd 
5  | eee 



Table B (users_likes) 
=====================
like_by | like_to 
=====================
1       | 2  
1       | 3  
2       | 3  
4       | 1  
5       | 1  

如果用户 'aaa'(id:1) 登录系统并执行搜索以列出除他的详细信息之外的所有用户,那么结果将是

2 | bbb 
3 | ccc 
4 | ddd 
5 | eee 

他还需要在列表时看到一个显示他的“like_by”的标志 例如:

2 | bbb | (flag:TRUE) 
3 | ccc | (flag:TRUE) 
4 | ddd | flag:false) 
5 | eee | (flag:false)

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    解决您的问题的一个简单方法是使用UNION 和少数SubQuery尽管可能存在除此之外的其他解决方案

    SQLFiddle Demo

    SELECT  DISTINCT b.id, b.name,'TRUE' AS FLAG
    FROM    users_likes a
                 INNER JOIN users b
                      on a.like_to = b.id
    WHERE   like_by = 1
    UNION
    SELECT  DISTINCT id, name,'FALSE' AS FLAG
    FROM    users
    WHERE   ID NOT IN
    (
         SELECT  DISTINCT b.id
         FROM    users_likes a
                      INNER JOIN users b
                           on a.like_to = b.id
         WHERE   like_by = 1
    )
    AND id <> 1
    

    或者不使用UNION,下面是更简单的解决方案。

    SQLFiddle Demo

    SELECT  a.id,
            a.name,
            IF(COALESCE(b.like_by, -1) = 1, 'TRUE', 'FALSE') AS `Flag`
    FROM    users a
                 LEFT JOIN users_Likes b 
                     ON a.id = b.like_to
    WHERE    a.ID <> 1
    GROUP BY a.id
    

    【讨论】:

    • 感谢 john,我尝试了第二个查询,它按预期工作正常。感谢您的及时帮助...非常感谢...
    【解决方案2】:

    试试这个查询

    select 
    B.like_to,
    BNames.name,
    case when B.like_by = 1 then True else False end
    from Table_A A
    left outer join Table_B B on A.id = B.like_by
    left outer join Table_A BNames on B.like_to = BNames.id
    where B.like_to <> 1
    

    希望对你有帮助。

    【讨论】:

    • 现在将显示准确的结果。特别是如果用户不喜欢某个用户。
    【解决方案3】:

    我想这就是你所追求的:

    SELECT a.id,a.name,b.like_by IS NOT NULL
    FROM users a
    LEFT JOIN users_likes b ON (a.id = b.like_to)
    GROUP BY a.id
    

    这将给出 'a' 的所有项目,其中有一个 like_to 的 1 和没有该 a 的 0。
    (您可以添加 WHERE a.id != 1 以排除用户 1)。

    编辑: 根据用户 1 的喜欢将第三列更改为真假。我原本以为是这样的。

    SELECT a.id,a.username,b.like_by IS NOT NULL
    FROM users a
    LEFT JOIN user_likes b ON (a.id = b.like_to AND b.like_by = 1)
    WHERE a.id != 1
    GROUP BY a.id
    

    http://sqlfiddle.com/#!2/ea34d/10

    【讨论】:

    • Jim,我尝试了这个查询,它带来了用户的所有值,并且每行都标记为“1”,甚至 user.id 是否等于 users_likes.like_by...请检查此链接[link]sqlfiddle.com/#!2/ea34d/3,谢谢你的尝试......
    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2013-01-27
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多