2012-01-05 10 views
2

からのアップデートでニュースフィードページを作成すると、ここではMySQLのテーブルです:friendsは人々

followed INT, <-- The user's id (the follower is following him) 
followedby INT <-- The follower's id 

とテーブルupdates

updateid INT, 
updatetext TEXT, 
updatetime DATETIME 
uid INT 

ユーザーID 2を持つ男は、ログインして見たいと思っています彼が従うユーザーの更新。 現在、彼は3人のユーザーしか追跡していません。アップデートを選択するには、私はこれを実行しないことができます。

SELECT * FROM updates WHERE (uid=10 , uid=20 OR uid=30) ORDERBY updatetime DESC LIMIT 10 

問題

を私はLOGGEDINユーザーが続くと、それらのユーザーによる更新を選択したいユーザーを選択します。 ユーザーは多くの友達を持つことができます。助けてください。

+0

あなたは文字列のユーザー情報(フォローしている人) – Dau

答えて

3
あなたはサブクエリを使用することができます

IN()

SELECT * 
FROM updates 
WHERE uid IN(SELECT followed FROM friends WHERE followedby = USERS_ID_HERE) 
ORDER BY updatetime DESC LIMIT 10 
+0

あなたは知っています。このSQL照会は正しくありません。サブクエリする必要があるのは 'friends'と__not__' followers'です。 – Treffynnon

+0

@Treffynnon:私はこのことがどのように機能し、コードではないか知りたかったのです。ニュースフィードのページを作成できました。 –

+0

@Treffええ、私はそこに "友達"を持っていた。なぜセルジオがそれを変えたのか分かりません。ロールバック –

2

sub-select in the where MySQL Docs句実装するSQL文に次の更新をお試しください:

SELECT * 
FROM updates 
WHERE uid IN (SELECT followed 
       FROM friends 
       WHERE followedby = '$current_user_id') 
ORDER BY updatetime DESC 
LIMIT 10 

$current_user_idは、現在ログインしているユーザーのIDですあなたのシステム。

0

これは複雑な問題です(「ユーザーは多くの友人がいる」ということです)。あなたのアプリが大きくなりすぎると、データベースは単一のサーバーに収まらなくなり、あなたは断片化する必要があります。これで、既存のスキーマに問題が発生します。

一部の大きなサイトでは、ユーザーごとに個別の「マテリアライズド」ニュースフィードを作成することでこの問題を解決しています。

しかし、今のところあなたはこれを必要としないと思います。他の答えを見てください。 :-)

関連する問題