2012-01-08 3 views
1

を取得しますだから私はこの2つのテーブルれている:私はのために友人を取得したい場所でビルA基本フレンズシステム:すべての友達クエリ

SELECT `friends`.`id`, 
`friends`.`username`, 
FROM `users` AS `u` 
JOIN `friendships` AS `fs` 
ON (`fs`.`user_id` = `u`.`id`) 
JOIN `users` AS `friends` 
ON (`friends`.`id` = `fs`.`friend_id`) 
WHERE `fs`.`user_id` = '10' 
OR `fs`.`friend_id` = '10' 

user table: 
id, username 
10, hovercraft 
11, mine_craft 

friendship table: 
id, user_id, friend_id 
1, 10,  11 

は今、私はこのSQLクエリを持っています特定のuser_id。しかし、このクエリは「双方向」検索を作成することはできません。なぜなら、私はuser_id 11を提供しているので、友達が現れていないからです。

これを回避する方法はありますか?

EDIT:私はそのfriend_idを追加するのを忘れはまた、あなたが少しあまりにも深くあなたのクエリを開始しているユーザテーブルに

答えて

1

追加、より良いバージョン(と思います) :(最初に配置)このクエリより

select u.id, username 
from user u 
left join friendship f1 on u.id = f1.user_id 
left join friendship f2 on u.id = f2.friend_id 
where coalesce(f1.friend_id, f2.user_id, u.id) <> u.id and 
    coalesce(f1.friend_id, f2.user_id, u.id) = 10 

:ここ

select id, username from (
    select u.id, username, case when f.friend_id <> u.id then f.friend_id else f.user_id end as friend_id 
    from user u 
    join friendship f on u.id = f.user_id 
    union 
    select u.id, username, case when f.friend_id <> u.id then f.friend_id else f.user_id end as friend_id 
    from user u 
    join friendship f on u.id = f.friend_id 
) t where friend_id = 10 
+0

を編集した。これを試した動作しません。私は時間がかかりますそれを勉強する:D – yretuta

1

をIDを参照します。友情のテーブルには、あなたがユーザIDを探すことができますフィールド、そしてそこにクエリを開始し、友人だけを選択するために、ユーザーテーブルに参加しているので:

SELECT u."id", u."username" 
FROM "friendships" AS f 
JOIN "users" AS u ON f.friend_id = u."friend_id" 
WHERE f."user_id" = 11 
+0

は、私はそれが私がCOALESCEを使用したのは初めてだけれども、これは、素晴らしいです質問 – yretuta

0

は私のソリューションです:困難は、正しい要求であるため、友人のR (AがBまたはBの質問に対してAがテーブルの "to"と "from"フィールドに逆の方法で格納されているかどうかを確認する場合)関係テーブルとは無関係に、どのユーザからも友人を得るためには、それとユーザーのUNIONやエイリアスが好きです。

  1. [友人]テーブル(リレーション):へ|から| statut(保留、確認)
  2. "に" と "から"> [ユーザー]テーブル

に制約をFOREIGN_KEYS以下のリクエストは、常に望ましい結果を提供します! (SESSIONでユーザーIDまたはユーザーIdで%dを置き換える

SELECT 
    users.userNickname, 
    friends.to AS friendUser, 
    friends.from AS currentUser, 
    friends.statut 
    FROM 
    users 
     INNER JOIN 
     friends 
     ON 
     users.userId = friends.to 
    WHERE 
    friends.from = '%d' 
UNION 
    SELECT 
    users.userNickname, 
    friends.from AS friendUser, 
    friends.to AS currentUser, 
    friends.statut 
    FROM 
    users 
     INNER JOIN 
     friends 
     ON 
     users.userId = friends.from 
    WHERE 
    friends.to = '%d' 
関連する問題