2011-05-25 10 views
0

私はいくつかの同様の質問を行ってきましたが、誰もこのタイプの問題に対処していないようです。2つ(またはそれ以上)のSQL結果をPHPと動的に結合しますか?

友人である人の投稿をすべて選択して整理したいと考えています。これまで私が試みたすべてのアプローチは、それがあなたの上に最新の投稿を表示していないので迷惑な友人同士で行っています。

Usersテーブル:

UId (Unique UserId) 

友達テーブル:

Person1 | Person2 

投稿表:

PostId | AuthorId | Text | DatePosted 

がここに私のデータベースが構成されている方法です、私は無関係な細部を残し

AuthorId、Person1およびPerson2はすべて、「UId」を介してユーザーにリンクしています。

+0

すべての友人の投稿を1つのSQLクエリで取得し、投稿日時順に並べ替えることができます。 –

+1

しかし、私はできません。私は別のテーブルを照会している間に複数の条件付きの別のテーブルについてSQLに問い合わせることはできません。 –

+3

'UserFriends'の構造を定義してください。私はそれが1つのクエリで実行できると確信しています。 – Shad

答えて

1

何かが動作します:

SELECT p.* 
FROM Posts p 
    JOIN FriendRequests fr 
    ON fr.from = p.authorid 
WHERE fr.accepted = 1 
    AND fr.to = @myid 
ORDER BY p.postdate DESC 
3

データベースをどのように構築したかわからなくても、これは答えるのが難しい質問です。

これまで、私はこのようなことをしました(単一のクエリ)が、私のデータベースはこの目的のために非常によく構成されていました。

SELECT * from posts 
LEFT JOIN users ON (poster_id=user_id) 
WHERE poster_id IN (
    SELECT related_id 
    FROM user_relationships 
    WHERE user_relationship = 'friend' 
    AND user_id = 1 
) 
ORDER BY post_date DESC 
LIMIT 20 

を追加しました - 今のMySQLの前で ないが、OPで指定されたDBのために、それはより多くの本のように見えることがあります。そのような

SELECT * from posts 
LEFT JOIN users ON (poster_id=user_id) 
WHERE poster_id IN (
    SELECT (if(user_idA='.$userId.'), user_idB, user_idA) as related_id, 
    FROM user_relationships 
    WHERE accepted = TRUE 
    AND '.$userId.' IN (user_idA, user_idB) 
) 
ORDER BY post_date DESC 
LIMIT 20 
+0

これは次のように構成されています(関連するテーブルのみではありません):投稿は投稿のテキスト、作成者の自動インクリメントID、独自の自動インクリメントID、 。 FriendRequestsは、whoを持つ友人を保存するテーブルです(一意のフレンドID、容認されたブール値、および両方の人の自動インクリメントIDである "from"および "to"を保持します)。ああ、そして「ユーザー」は、自動増分IDを持っています。 –

+0

FriendRequestsを除いて、かなり似ています。私はユーザーAの多くがより複雑なチェーンと一方向の関係を可能にするブーリアンの代わりにビットフィールドを持つユーザーBに関連しています。 –

関連する問題