[英]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.