0

わかりましたので、MySQL の検索機能を作成していますが、うまくいかないように見えるものに遭遇しました。ユーザーの友達を検索し、スコアの高い友達を返すスクリプトを作成しようとしています。これは私がこれまでに持っているものです:

SELECT id, first_name, last_name, image_id FROM users
WHERE id IN (
    SELECT receiver AS friend FROM friends WHERE initiator = :me AND status = :status        
     UNION
    SELECT initiator AS friend FROM friends WHERE receiver = :me AND status = :status
) ORDER BY score AND concat(first_name, ' ', last_name) LIKE '%test query%';

これで、友人をスコアで並べ替えようとするまで、すべてが機能します。友達をスコアで並べ替える方法を練習できる人はいますか? 何か明確にする必要がある場合は、お尋ねください。

次の2つのテーブルがあります。

ユーザー テーブル:ここに画像の説明を入力

フレンド テーブル:ここに画像の説明を入力

ここに要求されたように、いくつかのサンプルデータがあります:

例として、3 人のユーザーがいます。

ID: 1, first_name: Michael, last_name: Sample
ID: 2, first_name: John, last_name: Citizen
ID: 3, first_name: Caitlin, last_name: Wired

以下の最初のエントリは、Michael が友達リクエストを開始し、Caitlin (受信者) がそれを受け入れたことを示すことで、Michael と Caitlin を友達にします。(したがって、1 のステータス) 彼らの基本スコアは 10 です。2 番目のエントリは、John が Caitlin とも友達である (Caitlin によって開始された) ことを示していますが、より良いスコアを持っています。

ID: 10000, initiator: 1, receiver: 3, status: 1, score: 10
ID: 10001, initiator: 3, receiver: 2, status: 1, score: 20

ということで今回のサンプルデータの場合。Caitlin が友人を検索しているユーザーである場合、Michael ではなく John が表示されるはずです。

4

2 に答える 2

3

外側のステートメントは、users列を持たない列からのみ選択しscoreます。副選択を使用するほぼすべてのステートメントは、結合を使用して書き直すことができます (そしてそうする必要があります)。この特定のケースでは、すべてのfriendsフィールドを句で使用できます。

SELECT u.id, u.first_name, u.last_name, u.image_id 
  FROM users AS u
    JOIN friends AS f 
      ON ...

WHERE副選択の句で使用される式が結合条件になります。OR結合は、ある意味で(どちらも基本的に接続詞です) と同等です。

      ON    (u.id = f.receiver AND f.initiator=:me AND status=:status)
         OR (u.id = f.initiator AND f.receiver=:me AND status=:status)

声明の残りの部分はほとんどそのままです。

  WHERE concat(first_name, ' ', last_name) LIKE '%test query%'
  ORDER BY score
;

すべて一緒に、それは次のとおりです。

SELECT u.id, u.first_name, u.last_name, u.image_id 
  FROM users AS u
    JOIN friends AS f 
      ON    (u.id = f.receiver AND f.initiator=:me AND status=:status)
         OR (u.id = f.initiator AND f.receiver=:me AND status=:status)
  WHERE concat(first_name, ' ', last_name) LIKE '%test query%'
  ORDER BY score
;

これはテストされておらず、私の頭のてっぺんから外れていることに注意してください。

于 2012-12-24T05:48:14.867 に答える
0
  • あなたはスコアを選択していません
  • ユニオン クエリは外側のクエリで順序付けされます

例: ユニオンで注文する場合

SELECT T.* /*ANY COLUMN SET WITH(OUT) SCORE */ FROM(
 SELECT SCORE,.... FROM ANOTHERTABLE  WHERE .....
 UNION SELECT SCORE,.... FROM ANOTHERTABLE WHERE ...

) T
ORDER BY SCORE

より良い書き換え

SELECT id, first_name, last_name, image_id FROM users
JOIN (
SELECT score,receiver AS friend FROM friends WHERE initiator = :me AND status = :status        
 UNION
SELECT score,initiator AS friend FROM friends WHERE receiver = :me AND status = :status
) t ON T.ID = users.id ORDER BY score AND concat(first_name, ' ', last_name) LIKE '%test query%';
于 2012-12-24T05:38:33.707 に答える