簡體   English   中英

在一個查詢中聯接/查找MySQL三個表

[英]Join/Look In Mysql Three Tables In One Query

我決定創建一個“您可能認識的人”系統,但我解決了一個問題,在該問題中,似乎需要加入三個表才能帶來相關結果。

目的是在數據庫表中檢查一個可能基於我的朋友的朋友認識的朋友(if user1 = user2 and user2 = user4 posibile user1 knows user4, user4 is a suggestion)我已經使用以下代碼檢查了這一點,並且按計划工作。

SELECT `friendpin` AS `possible_friend_id`
FROM `pinme`
WHERE `senderpin`
IN (
SELECT `friendpin`
FROM `pinme`
WHERE `senderpin` = $userlogged
)
AND `friendpin` NOT
IN (

SELECT `friendpin`
FROM `pinme`
WHERE `senderpin` = $userlogged
)
AND NOT `friendpin` = $userlogged
GROUP BY `possible_friend_id`
ORDER BY COUNT( * ) DESC
LIMIT 0 , 3 

因此,有可能該請求者狀態在REQUEST表中,他/她已經有一個待處理的請求,但仍顯示為建議的朋友,或者在BLOCKED表中,該建議的朋友被阻止了,但仍然顯示為建議的朋友。 因此,我想消除這種現象。 建議的人員不應在REQUEST表或BLOCKED表中退出。

誰能幫我解決這個問題?

以下是REQUEST表, PINME表和BLOCKED表的結構

REQUEST TABLE:
senderpin - id of the person who send request   
friendpin - receivers request id    


BLOCKED TABLE: 
user1_id - a person who block user2_id
user2_id - the blocked person by user1_id


PINME TABLE:
PINME table: the table which keep relations
structure: 1,2 2,2 | 4,8 8,4
senderpin - id of the person who send request   
friendpin - receivers request id

謝謝並恭祝安康

您似乎需要做的就是將pinme表與其自身連接起來,然后再次針對其自身以找到匹配項。 對被阻止的表和請求表進行LEFT OUTER JOIN及其結果,以排除已經存在被阻止或請求記錄的任何記錄。

像這樣的東西:

SELECT DISTINCT c.aPerson
FROM (SELECT friendpin AS aFriend FROM pinme WHERE senderpin = $userlogged UNION SELECT senderpin AS aFriend FROM pinme WHERE friendpin = $userlogged) a
INNER JOIN (SELECT senderpin AS aPerson, friendpin AS aFriend FROM pinme UNION SELECT senderpin AS aFriend, friendpin AS aPerson FROM pinme) b
ON a.aFriend = b.aFriend
INNER JOIN (SELECT senderpin AS aPerson, friendpin AS aFriend FROM pinme UNION SELECT senderpin AS aFriend, friendpin AS aPerson FROM pinme) c
ON b.aPerson = c.aFriend
LEFT OUTER JOIN (SELECT user1_id AS blocked FROM blocked WHERE user2_id = $userlogged UNION SELECT user2_id AS aFriend FROM blocked WHERE user1_id = $userlogged) d
ON c.aPerson = d.blocked
LEFT OUTER JOIN (SELECT senderpin AS blocked FROM request WHERE friendpin = $userlogged UNION SELECT friendpin AS aFriend FROM request WHERE senderpin = $userlogged) e
ON c.aPerson = e.blocked
WHERE d.blocked IS NULL
AND  e.blocked IS NULL
AND c.aPerson != $userlogged

編輯-修改建議

SELECT DISTINCT c.aPerson
FROM (SELECT senderpin AS aPerson, friendpin AS aFriend FROM pinme WHERE senderpin = $userlogged UNION SELECT senderpin AS aFriend, friendpin AS aPerson FROM pinme WHERE friendpin = $userlogged) a -- Find friends
INNER JOIN (SELECT senderpin AS aPerson, friendpin AS aFriend FROM pinme UNION SELECT senderpin AS aFriend, friendpin AS aPerson FROM pinme) b -- Find friends of friends who are not the original person
ON a.aFriend = b.aFriend AND a.aPerson != b.aFriend
LEFT OUTER JOIN (SELECT senderpin AS aPerson, friendpin AS aFriend FROM pinme WHERE senderpin = $userlogged UNION SELECT senderpin AS aFriend, friendpin AS aPerson FROM pinme WHERE friendpin = $userlogged) c -- Find friends
ON c.aFriend = b.aPerson 
LEFT OUTER JOIN (SELECT user1_id AS blocked FROM blocked WHERE user2_id = $userlogged UNION SELECT user2_id AS aFriend FROM blocked WHERE user1_id = $userlogged) d
ON b.aPerson = d.blocked
LEFT OUTER JOIN (SELECT senderpin AS blocked FROM request WHERE friendpin = $userlogged UNION SELECT friendpin AS aFriend FROM request WHERE senderpin = $userlogged) e
ON b.aPerson = e.blocked
WHERE d.blocked IS NULL
AND  e.blocked IS NULL
AND  c.aFriend IS NULL
AND b.aPerson != $userlogged

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM