0

これを行う方法はわかりませんが、2 つのテーブルがあります。

--users--
id_users (index)
name_users


--friend--
id_friend (index)
id_user (connects to id_users)
linked_friend (also links to id_users as this is the id of the requested friend)

フレンドシップをリクエストするには、friend.id_user 列でリクエストしたユーザーと、friend.linked_friend 列でリクエストしているユーザーが 1 つの行に存在します。フレンドシップ リンクを確認するために、別の行が作成され、情報が逆になります。これにより、フレンドシップごとに 2 つの行が作成され、各ユーザーは、friend.id_user および friend.linked_friend 列に含まれます。(もっと良い方法があれば教えてください)

したがって、私がする必要があるのは、ユーザーごとに、確認済みの友情 (2 行) にあり、自分自身ではないシステム上のすべてのユーザーをリストすることです。

SELECT id_user, name_user FROM user WHERE id_user <> $userId

明らかにリストから自分自身を削除しますが、両方の行を持つユーザーを選択する方法について途方に暮れています。

それが十分に明確であることを願っています。

ありがとう

4

2 に答える 2

0

2つ以上のテーブルからデータをフェッチする場合は、Joinを使用する必要があります。

これを試して

select * from users left join friend on users.id_users = friend.id_user 

//特定のuser_idのwhere条件も指定します

于 2013-03-02T09:51:37.077 に答える
0

joinフレンドテーブルを2回使用して、両方向の行が存在するように要求できます。

select  u1.name
,       u2.name
from    users u1
join    friend f1
on      u1.id_users = f1.id_user
join    friend f2
on      f2.id_user = f1.linked_friend 
        and f2.linked_friend = f1.id_user
join    users u2
on      u2.is_users = f2.id_user
        and u1.id_users < u2.id_users -- Display friends once

私は、このデザインがかなり不格好であるというジャック・ペッティンジャーに同意します。リレーションごとに、friendsテーブルに1つの行のみが存在する必要があります。これを強制するには、次のような一意の制約が必要です。

alter table Friends add constraint CHK_Friend check (friend1_id < friend2_id);
create index UX_Friends on Friends (friend1_id, friend2_id);
于 2013-03-02T09:32:52.610 に答える