2012-08-08 78 views
0

我需要mySQL的帮助连接表应该列出'表A'中的所有用户,并且还应该通过匹配'表B中的记录来显示标志“mysql连接显示左表中的所有记录,并在右表中匹配记录的标记

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) 

回答

2

您的问题一个简单的解决方案是使用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 
+0

谢谢约翰,我试了第二个查询,它工作正常,如预期的..感谢您的及时帮助...非常感谢... – sajan 2012-08-08 17:27:54

0

我觉得这是你追求的:

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' 与1,那里是一个like_to到一个和0没有的地方。
(您可以添加WHERE a.id!= 1来排除用户1)。

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

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

+0

吉姆,我试过这个查询它带来了所有用户的价值,也标志为'1'每一行,甚至user.id等于users_likes.like_by或不... ...请检查此链接[链接] http://sqlfiddle.com/#!2/ea34d/3,任何方式谢谢你的尝试... – sajan 2012-08-08 17:31:43

+0

@sajan对不起。我误解了你的想法。将编辑。 – Jim 2012-08-09 09:30:04

+0

吉姆,感谢您编辑的版本... – sajan 2012-08-09 18:46:01

0

尝试此查询

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 

希望它帮助。

+0

在这里看到http://sqlfiddle.com/#!2/699a4/2 – 2012-08-08 14:24:58

+0

这现在将显示确切的结果。特别是如果用户不喜欢某个用户。 – 2012-08-09 00:00:21

相关问题