SQL フィドル: http://www.sqlfiddle.com/#!2/60689e/12
現時点でのクエリは次のようになります。
SELECT DISTINCT u.name_surname, u.avatar, u.location
FROM users AS u
JOIN connections AS c ON c.user_id = u.id
JOIN words_en AS w ON w.id = c.word_id
WHERE (w.word = :kwd
OR u.location = :kwd
OR u.name_surname = :kwd)
AND u.privacy > 0
AND c.deleted <> 1
これはユーザーの検索クエリで、場所の name_surname と単語を調べて、それらの列のどこかにこのキーワードを所有しているユーザーを表示します。
このクエリに、現在のユーザーと検索されたユーザーの関係を何らかの方法で組み込みたいと考えています。
u.privacy は 0、2、3 です。0 は非公開を意味し、検索結果から除外されます。2は友達のみ。そして3はみんなです。このプライバシー=2パートを組み込むのに苦労しています。したがって、見つかったユーザーのプライバシー設定が 2 の場合、私は彼らの関係を比較し、友人の場合は検索されたユーザーを表示し、そうでない場合は表示しません。
リレーションシップは、フレンド テーブルに双方向ストリームとして保存されます。
これは、person1 のすべての友人を選択するために使用するクエリです。
SELECT GROUP_CONCAT(f1.asked_user_id) AS friend_id
FROM friends AS f1 JOIN friends AS f2
ON f1.asked_user_id = f2.asker_user_id
AND f1.asker_user_id = f2.asked_user_id
WHERE f1.status = 1 AND f2.status = 1
AND f1.asker_user_id = :person1
どんな助けでも大歓迎です!ありがとう!
アップデート
SELECT (u.id) as uuid, u.avatar, u.location, u.name_surname,
MAX(CONCAT_WS(", ",
CASE WHEN w.word = :kwd THEN "words list" END,
CASE WHEN u.location = :kwd THEN "location" END,
CASE WHEN u.name_surname = :kwd THEN "name" END)) As matched
FROM users AS u
JOIN connections AS c
ON c.user_id = u.id
JOIN words_en AS w
ON w.id = c.word_id
LEFT JOIN friends AS f1
ON f1.asker_user_id = :user_id
AND f1.status = 1
AND f1.asked_user_id = u.id
WHERE (w.word = :kwd
OR u.location = :kwd
OR u.name_surname = :kwd)
AND (u.privacy = 3 OR (u.privacy = 2 and f1.id IS NOT NULL))
AND c.deleted <> 1
GROUP BY u.id
ORDER BY matched DESC
このクエリは機能しますが、ユーザーが接続にまったく単語を持っていない場合は、場所の選択で一致が正であっても何も返しません。