简体   繁体   English

在一个查询中联接/查找MySQL三个表

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

I decided to create People You May Know System but i have accounted a problem where it seems I need to join three tables to bring relevant results. 我决定创建一个“您可能认识的人”系统,但我解决了一个问题,在该问题中,似乎需要加入三个表才能带来相关结果。

The aim is to check in database table for possible friends one may know based on friend of my friend (if user1 = user2 and user2 = user4 posibile user1 knows user4, user4 is a suggestion) I have used the following code to check this and is working as to plan. 目的是在数据库表中检查一个可能基于我的朋友的朋友认识的朋友(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 

Thus its possible that the suggested person status in REQUEST table he/she has already a request pending to you but still being shown as suggested friend or in the BLOCKED table the suggested friend was blocked but still appear to you as suggested friend. 因此,有可能该请求者状态在REQUEST表中,他/她已经有一个待处理的请求,但仍显示为建议的朋友,或者在BLOCKED表中,该建议的朋友被阻止了,但仍然显示为建议的朋友。 therefore I would like to eliminate this behavior. 因此,我想消除这种现象。 a suggested person should not be exits either in REQUEST table or BLOCKED table. 建议的人员不应在REQUEST表或BLOCKED表中退出。

Can anyone help me solve this? 谁能帮我解决这个问题?

the following are the REQUEST table, PINME table and BLOCKED table structure 以下是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

Thanks and regards 谢谢并恭祝安康

What you seem to need to do is join the pinme table against itself, and then against itself again to find the matches. 您似乎需要做的就是将pinme表与其自身连接起来,然后再次针对其自身以找到匹配项。 Do a LEFT OUTER JOIN with the results of that against the blocked table and against the request table to exclude any records where there is already a blocked or request record. 对被阻止的表和请求表进行LEFT OUTER JOIN及其结果,以排除已经存在被阻止或请求记录的任何记录。

Something like this:- 像这样的东西:

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

EDIT - Modified suggestion 编辑-修改建议

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