0

我有 2 张桌子

members
=======
id
f_name  // get these values.
l_name
email

friends
=======
to
from

用户的 Id 是值 $member_id,如果它存在于“to”或“from”中,我希望它不返回该行的其他值,因此只显示非朋友。

我正在创建一个页面以允许成员搜索数据库以通过电子邮件或姓名添加他们的朋友。

我想返回朋友表的“to”或“from”列中没有用户 ID 记录的成员的所有行。

我知道如何做最基本的mysql,但连接对我来说是个问题,我真的不明白如何编写它们,如果有人可以帮助我,甚至可以解释一下,那就太好了!

My query now:
  $query = "SELECT * FROM members WHERE f_name LIKE '%" . $word . "%' OR l_name LIKE '%" . $word . "%' OR mc_name LIKE '%" . $word . "%' OR email LIKE '%" . $word . "%' LIMIT 10";
//Where $word is the search term.

修改后的查询

SELECT * FROM members WHERE id NOT IN (SELECT to FROM friends WHERE frm=$member_id) AND $member_id NOT IN (SELECT frm FROM friends WHERE to=$member_id) AND f_name LIKE '%" . $word . "%' OR l_name LIKE '%" . $word . "%' OR mc_name LIKE '%" . $word . "%' OR email LIKE '%" . $word . "%' LIMIT 10
4

2 回答 2

0

您也许可以使用 LEFT Join 来做到这一点,即使朋友的表上没有相应的行,它也会返回成员的所有行。

像这样的东西:

SELECT a.*, f.* FROM members m LEFT JOIN friends f

一篇很好的文章来了解有很多连接是这个。

于 2012-09-13T00:46:30.310 回答
0

已编辑

所以,假设一个 id 为 3 的用户:

SELECT * 
FROM members
WHERE id <> 3 
AND id NOT IN (SELECT to FROM friends WHERE from = 3)
AND id NOT IN (SELECT from FROM friends WHERE to = 3)
[Other conditions....];

或者

SELECT * 
FROM members
LEFT JOIN friends
ON (members.id = friends.to
    OR members.id = friends.from)
AND (members.to = 3 
     OR members.from = 3)
WHERE friends.to IS NULL
AND id <> 3
[Other conditions....];

也许考虑更改“from”和“to”列的名称,以避免混淆,因为 FROM 和 TO 是保留字。

此外,您可以在查询之前使用保留字 EXPLAIN 来查看正在获取的行数的差异。

于 2012-09-13T00:50:17.900 回答