0

私は2つのテーブルを持っています

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

friends
=======
to
from

ユーザーのI'dは値$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結合を使用してこれを行うことができる場合があります。これにより、友人のテーブルに対応する行がない場合でも、メンバーからすべての行が返されます。

このようなもの:

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

そこにある多くの結合を理解するための素晴らしい記事はこれです。

于 2012-09-13T00:46:30.310 に答える
0

編集済み

したがって、ID3のユーザーを想定します。

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 に答える