2012-08-08 80 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

相關問題