0

我试图找到两个用户之间的相互联系。联系人表是这样设置的:

userprofile_usercontact
- first_user_id
- second_user_id
- mutual

以下是我想要实现的查询:

/* get the first user's contacts */
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 1 AND mutual = 1
   UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 1 AND mutual = 1
    *INTERSECT*
/* get the second user's contacts */
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 37 AND mutual = 1
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 37 AND mutual = 1

我将如何实现这一目标?

4

2 回答 2

1

我不明白共同属性的重要性 - 但由于它在您的示例代码中始终为 1,因此要找到 $user1 和 $user2 之间的共同联系人(单度分离),只需(内部)加入数据.

SELECT user1_contacts.uid
FROM
(SELECT a.first_user_id as uid
 FROM userprofile_usercontact a
 WHERE a.second_user_id=$user1
 AND a.mutual=1
 UNION
 SELECT b.second_user_id
 FROM userprofile_usercontact b
 WHERE b.second_user_id=$user1
 AND b.mutual=1) as user1_contacts,
(SELECT a.first_user_id as uid
 FROM userprofile_usercontact a
 WHERE a.second_user_id=$user2
 AND a.mutual=1
 UNION
 SELECT b.second_user_id
 FROM userprofile_usercontact b
 WHERE b.second_user_id=$user2
 AND b.mutual=1) as user2_contacts
WHERE user1_contacts.uid=user2_contacts.uid

实际上,您正在强制合并连接,这可能不是最有效的解决方案(但比尝试使用“IN”和“OR”要高效得多。可以使用嵌套查找来编写整个内容,但是代码会变得非常混乱。

如果您想超越单一程度的分离,那么使用图形优化的 DBMS会更干净

于 2012-06-06T10:28:15.053 回答
0

这不漂亮,但它应该工作:

SELECT * FROM userprofile_usercontact 
WHERE 
(
first_user_id IN
(
/* get the first user's contacts */
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 1 AND mutual = 1
   UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 1 AND mutual = 1
) AND first_user_id IN (
/* get the second user's contacts */
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 37 AND mutual = 1
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 37 AND mutual = 1
)
) OR (
second_user_id IN
(
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 1 AND mutual = 1
   UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 1 AND mutual = 1
) AND second_user_id IN (
/* get the second user's contacts */
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 37 AND mutual = 1
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 37 AND mutual = 1
)
)
于 2012-06-06T09:51:48.047 回答