如果在其他表中不存在则返回行

时间:2012-09-13 00:35:37

标签: php mysql database join

我有2张桌子

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

friends
=======
to
from

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

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

我想从在friends表的“to”或“from”列中没有userid记录的成员返回所有行。

我知道如何做最基本的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

2 个答案:

答案 0 :(得分:0)

你可以使用LEFT Join来做到这一点,即使朋友的桌子上没有相应的行,也会从成员返回所有行。

这样的事情:

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

理解许多联接的好文章是this one.

答案 1 :(得分: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....];

OR

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来查看正在提取的行数的差异。