1

最初に、私はまだ高度な MySQL があまり得意ではないことを指摘したいと思います。だから許してください。私がやろうとしているのは、下の画像にあるような友達リストを作成することです:

ここに画像の説明を入力

これが私のデータベース構造です:

友達テーブル: ここに画像の説明を入力

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

これまでの私のコードは次のとおりです。

<?php  $query3 = $this->db->query("SELECT * FROM friends WHERE node1id = '{$myuserid}'");
        foreach($query3->result() as $row1) {
        echo $row1->node1id."<br>"; } ?>

このコードが論理的に正しくないことはわかっています。私がやろうとしているのは、users テーブルを取得することです。また、relationType = friends の場合、ユーザーの姓と名をフレンド リストに表示します。私は2つの変数を持っています。$selectedId と $myuserid。$selectedId は、ユーザーが表示しているプロファイルの ID です。$myuserid はログインしているユーザーの ID です。このタイプの機能を論理的にコーディングするにはどうすればよいでしょうか?

4

3 に答える 3

1
SELECT username FROM users 
WHERE userid IN 
    (SELECT node2id FROM friends WHERE node1id = '{$myuserid}' 
    AND relationType = 'friends')

echo $row1->username

共通の友達の場合、これを行うことができます

編集:これの最後のバージョンが正しくないことに気付きました。現在修正されています(テストされていません)

SELECT username FROM users 
WHERE userid IN 
    (SELECT node2id FROM (
        (SELECT node2id FROM friends WHERE relationType = 'friends' AND node1id <> '{$myuserid}' AND node1id IN
            (SELECT node2id FROM friends WHERE relationType = 'friends' AND node1id = '{$myuserid}'))) 
         WHERE node2id IN (SELECT node2id FROM friends WHERE relationType = 'friends' AND node1id = '{$myuserid}'))

これは最初に友達を選択し、次に自分と等しくない(等しくないのは<>)それらの友達の友達を選択します。次に、そのリストから、自分のフレンド ID に一致するフレンド ID のみを選択します。次に、users テーブルからこれらのユーザーの名前を選択します。

于 2012-08-01T22:40:25.040 に答える
0

特定のユーザー ( $selectedid) のすべての友達を取得し、それぞれの友達が共通の友達かどうかを判断する方法は次のとおりです。

SELECT    b.*, 
          c.myfrnd IS NOT NULL AS isMutual
FROM      (
          SELECT IF(node2id = '$selectedid', node1id, node2id) AS usrfrnd
          FROM   friends
          WHERE  '$selectedid' IN (node1id,node2id) AND
                 relationType = 'friends'
          ) a
JOIN      users b ON a.usrfrnd = b.userid
LEFT JOIN (
          SELECT IF(node2id = '$myuserid', node1id, node2id) AS myfrnd
          FROM   friends
          WHERE  '$myuserid' IN (node1id,node2id) AND
                 relationType = 'friends'
          ) c ON b.userid = c.myfrnd
ORDER BY  isMutual DESC

列には、友人が共通の友人である場合、そうでない場合isMutualが含まれます。相互の友人が結果セットの最初に表示されます。10

考慮しなければならないことは、ユーザーが列node1idまたはのいずれかに存在する可能性があることです。そのnode2idため、一貫した結合を得るために、サブセレクトを使用して、パラメーター userids ($selectedidおよび$myuserid) のフレンドを強制的に同じ列に配置します。

これがどのように機能するか教えてください。

于 2012-08-01T22:58:42.413 に答える
0

以下のように選択の中で選択を行うことができます:

SELECT * FROM users WHERE idusers IN (
   SELECT node2id FROM friends WHERE node1id = $myUserId
)
于 2012-08-01T22:41:27.790 に答える