[英]mysql join show all records in left table with a flag for matching records in right table
我需要来自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)
一个简单的问题解决方案是使用UNION
和少量SubQuery
( 虽然 SubQuery
可能存在其他解决方案 )
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
,更简单的解决方案是下面的解决方案。
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
我想这就是你所追求的:
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到a和0,而没有。
(您可以添加WHERE a.id!= 1以排除用户1)。
编辑:根据用户1的喜好将第三列更改为true。 我原本以为它就像是一样。
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
试试这个查询
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
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.