2
  • ウェブサイトでユーザーを検索する機能がありますが、
  • 私のサイトには友達向けの機能もあります。
  • 自分のサイトで正しいユーザーを検索するためのクエリがあり、
  • ユーザーが友達であるユーザーを判別するクエリがあります。どちらも正常に機能します。

ですから、私が支援を必要としているのは、他のユーザーの前に友達を注文するために、2つを組み合わせることです。

検索クエリー:

SELECT userID, fname, lname, 
FROM names 
WHERE (
    fname LIKE '".$term."%' 
    OR lname LIKE '".$term."%' 
    OR CONCAT(fname, ' ', lname) LIKE '".$term."%'
      ) 
AND userID!=$session 
ORDER BY fname ASC, lname ASC 
LIMIT 10

友達のクエリ:

SELECT CASE WHEN userID=$session 
            THEN userID2 
            ELSE userID 
            END AS friendID 
FROM friends
WHERE (
       userID=$session 
       OR userID2=$session
       ) 
AND state='1'

したがって、2つを比較するステートメントは、次のようになります。IF names.userID=friends.friendID

今、私はこれを行う簡単な方法のように見えるスタックオーバーフローに関する同様の問題についてのユーザーの提案を見つけましたが、それはより複雑なクエリであるため、特定の友達のクエリでそれを追加する方法が完全にはわかりません。

SELECT
    posting.id,
    IF(a.friend_id = b.criteria, 1, 0) AS is_friend
...
ORDER BY is_friend DESC, posting.id DESC
4

1 に答える 1

2

外部結合(左結合)を使用して、最初のクエリによって返されたユーザーリストを、2番目のクエリが生成するフレンドリストと結合します。これで、2番目の行セットが一致するかどうかを並べ替えることができます。一致する場合は、対応する行が最初に表示されます。

これは、上記を実装する方法の例です。

SELECT
  n.userID,
  n.fname,
  n.lname
FROM names n
LEFT JOIN (
  SELECT CASE WHEN userID=$session 
              THEN userID2 
              ELSE userID 
              END AS friendID 
  FROM friends
  WHERE (
         userID=$session 
         OR userID2=$session
         ) 
  AND state='1'
) f
ON n.userID = f.friendID
WHERE (
    n.fname LIKE '".$term."%' 
    OR n.lname LIKE '".$term."%' 
    OR CONCAT(n.fname, ' ', n.lname) LIKE '".$term."%'
      ) 
AND n.userID!=$session 
ORDER BY (f.friendID IS NULL), n.fname ASC, n.lname ASC 
LIMIT 10

最初の並べ替え基準である、は、一致する行があるかどうか、つまりユーザーが友達であるかどうか(f.friendID IS NULL)を評価し、そうでない場合は評価します。したがって、の前に並べ替えられるため、友達は友達以外の前に並べ替えられます。falseftruefalsetrue

于 2012-11-12T06:11:52.513 に答える