0

我决定创建你可能认识的人系统,但我已经解决了一个问题,我似乎需要加入三个表才能带来相关结果。

目的是根据我朋友的朋友在数据库表中检查可能认识的朋友(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

谢谢并恭祝安康

4

1 回答 1

0

您似乎需要做的是加入 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
于 2013-07-01T08:39:15.797 回答